Tree 方案等树程序

Tree 方案等树程序,tree,scheme,racket,continuation-passing,Tree,Scheme,Racket,Continuation Passing,给出了使用列表的方案中树的新实现: (define make-tree list) (define add-subtree cons) (define make-leaf (lambda (x) x)) (define empty-tree? empty?) (define first-subtree car) (define rest-tree cdr) (define composite-tree? list?) (define leaf? (lambda (x) (not (composi

给出了使用列表的方案中树的新实现:

(define make-tree list)
(define add-subtree cons)
(define make-leaf (lambda (x) x))
(define empty-tree? empty?)
(define first-subtree car)
(define rest-tree cdr)
(define composite-tree? list?)
(define leaf? (lambda (x) (not (composite-tree? x))))
实施CPS程序equal tree$,该程序接收一对叶值树,
t1
t2
,以及两个延续:
succ
fail
,并确定其结构标识,如下所示:

  • 如果
    t1
    t2
    具有相同的结构,则equal tree$返回具有相同结构的树,但其中每个叶包含一对位于该位置的原始两棵树的叶(无论其值是否一致)

  • 否则,equal tree$将返回一对在树的深度优先遍历中具有第一个冲突子树的树

例如:

(define id (lambda (x) x))
(equal-trees$ '(1 (2) (3 9)) '(7 (2) (3 5)) id id) ---> '((1 . 7) ((2 . 2)) ((3 . 3) (9 . 5)))
我尽力解决这个问题,但我遇到了一个bug,希望有人能帮我解决它

这是我的尝试:

(define equal-tree$
  (lambda (tree1 tree2 succ fail)
    (if (and (empty? tree1) (empty? tree2))
      '()
      (if (or (empty? tree1) (empty? tree2))
        (fail '())
        (if (and (leaf? tree1) (leaf? tree2))
          (succ (cons tree1 tree2))
          (if (or (leaf? tree1) (leaf? tree2))
            (fail (cons (car tree1) (car tree2)))
            (equal-tree$ (car tree1) (car tree2) 
               (lambda (X) cons(cons (car tree1) (car tree2)) x) fail)))))
   )
)
下面是上面示例的输出(我只是不知道为什么它会打印
”(1.7)
…:

'(1 . 7)

您有一个合理的
if
测试序列(尽管使用
cond
更为惯用),但返回的值通常看起来不正确

我看到的第一个问题是在第一个
if
子句中。如果两个树都为空,则返回
'()
。但是根据规范,您应该调用带有该结果的
succ
函数。如果使用
id
作为延续,这可能看起来不重要,但请注意,每个递归步骤都会建立一个更详细的
succ
延续,因此通常
succ
可能是一个非常有影响力的函数

第二个
if
也是一个问题。再次返回
'()
,当您应该返回第一个冲突子树时。我不清楚这意味着什么,但将一对
tree1
tree2
传递给
fail
是合理的

第三和第四个子句看起来很好。您使用一对两个叶子调用
succ
,正如预期的那样

递归调用显然是错误的:您对
cons
的调用被错误地插入括号,并且您的lambda变量名为
X
,但您将其称为
X
。这一系列
cons
调用看起来也不太正确,但一旦解决了更紧迫的语法问题,您可以尝试一下r基本情况正常工作


最后,您正在使用
cons
car
'()
等进行大量的底层工作。您应该使用提供给您的抽象函数,例如
添加子树
(生成树)
,而不是使用它们所基于的底层原语。

非常感谢您的时间!