0

我在 scheme 中编写了 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))
                               ))))
4

2 回答 2

3

这段代码真的很复杂。首先,我没有看到 else 语句,以及一个相当大的案例下降(如果两个分支都不是空树)。其次,当您已经有空树的案例时,为什么还要担心左侧或右侧是否为空?

(define (tree-map f T)
 (cond ((null? T) '())
       (else (make-tree (f (value T))
                        (tree-map f (left T))
                        (tree-map f (right T))))))

作为人类编译器并不好玩。你对叶子、左空和右空的情况所做的只是重写相同的代码,但在适当的地方手动放入'(),而不是依赖函数为你做这件事。

于 2013-10-17T17:57:42.917 回答
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))))))
于 2013-10-17T16:39:22.157 回答