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
具有相同的结构,则equal tree$返回具有相同结构的树,但其中每个叶包含一对位于该位置的原始两棵树的叶(无论其值是否一致)t2
- 否则,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
、'()
等进行大量的底层工作。您应该使用提供给您的抽象函数,例如添加子树
和(生成树)
,而不是使用它们所基于的底层原语。非常感谢您的时间!