Recursion Scheme中的树映射函数

Recursion Scheme中的树映射函数,recursion,map,scheme,binary-tree,binary-search-tree,Recursion,Map,Scheme,Binary Tree,Binary Search Tree,我在scheme中编写了90%的树映射函数,但我遇到了一个我遇到麻烦的主要问题。当我用二叉树测试代码时,除了第一个节点之外,其他节点都被正确映射。第一个节点退出,我似乎想不出解决这个问题的方法。如有任何建议,将不胜感激 (define (value tree) (car tree)) (define (left tree) (car (cdr tree))) (define (right tree) (car (cdr (cdr tree)))) (define (tree-ma

我在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))
                               ))))

似乎有几个错误:

  • 如果找到叶节点,则不会将该函数应用于该节点
  • 缺少节点同时具有两个子树的情况
  • 应用函数的部分是错误的
请在您的一个示例中尝试此操作,问题不包括自己测试它所需的所有代码:

(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))))))

似乎有几个错误:

  • 如果找到叶节点,则不会将该函数应用于该节点
  • 缺少节点同时具有两个子树的情况
  • 应用函数的部分是错误的
请在您的一个示例中尝试此操作,问题不包括自己测试它所需的所有代码:

(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))))))

这段代码真的很复杂。首先,我看不到else语句,还有一个相当大的大小写下降(如果两个分支都不是null树)。第二,既然已经有空树的例子,为什么还要担心左或右是空的呢

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

作为一个人工编译器一点也不有趣。叶、左空和右空的所有情况都是重写相同的代码,但是在适当的地方手动插入'(),而不是依赖函数来为您完成

这段代码真的很复杂。首先,我看不到else语句,还有一个相当大的大小写下降(如果两个分支都不是null树)。第二,既然已经有空树的例子,为什么还要担心左或右是空的呢

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

作为一个人工编译器一点也不有趣。叶、左空和右空的所有情况都是重写相同的代码,但是在适当的地方手动插入'(),而不是依赖函数来为您完成

成功!顺便说一下,我没有提供创建树的函数的原因是它有点长。如果你认为我应该把它添加到这篇文章中,请告诉我。成功!顺便说一下,我没有提供创建树的函数的原因是它有点长。如果你认为我应该把它添加到这篇文章中,让我知道。有时候我们想得太多了,不是吗?有时候我们想得太多了,不是吗?