我在计划中编写了90%的树图函数,但是遇到了一个我遇到问题的主要问题。当我用二叉树测试我的代码时,除了第一个节点之外的所有节点都被正确映射。第一个节点退出了,我似乎无法想到解决这个问题的方法。这里有任何建议,我们将不胜感激。
(define (value tree)
(car tree))
(define (left tree)
(car (cdr tree)))
(define (right tree)
(car (cdr (cdr tree))))
(define (tree-map f T)
(cond ((null? T) '())
((and (null? (right T))(null? (left T))) '())
((and (null? (right T))(not (null? (left T))))
(make-tree (f (value(left T)))
(tree-map f (left T))
(right T)))
((and (null? (left T))(not (null? (right T))))
(make-tree (f (value(right T)))
(left T)
(tree-map f (right T))
))))
答案 0 :(得分:2)
这段代码真是令人费解。首先,我没有看到else语句,并且看起来很大(如果两个分支都不是null tress)。第二个为什么你担心如果你已经有一个空树的情况,左边或右面是否为空?
(define (tree-map f T)
(cond ((null? T) '())
(else (make-tree (f (value T))
(tree-map f (left T))
(tree-map f (right T))))))
作为人类编译器并不好玩。所有你不喜欢你的叶子,空左和空右的情况都会重写相同的代码,但是在适当的情况下手动放入'(),而不是依靠函数来为你做。
答案 1 :(得分:1)
似乎有一些错误:
尝试使用您的一个样本,问题不包括我自己测试的所有必要代码:
(define (tree-map f T)
; empty tree
(cond ((null? T)
'())
; leaf node
((and (null? (right T)) (null? (left T)))
(make-tree (f (value T)) '() '()))
; empty right subtree
((and (null? (right T)) (not (null? (left T))))
(make-tree (f (value T))
(tree-map f (left T))
'()))
; empty left subtree
((and (null? (left T)) (not (null? (right T))))
(make-tree (f (value T))
'()
(tree-map f (right T))))
; both subtrees are present
(else
(make-tree (f (value T))
(tree-map f (left T))
(tree-map f (right T))))))