Recursion Scheme中的树映射函数
我在scheme中编写了90%的树映射函数,但我遇到了一个我遇到麻烦的主要问题。当我用二叉树测试代码时,除了第一个节点之外,其他节点都被正确映射。第一个节点退出,我似乎想不出解决这个问题的方法。如有任何建议,将不胜感激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
(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))))))
作为一个人工编译器一点也不有趣。叶、左空和右空的所有情况都是重写相同的代码,但是在适当的地方手动插入'(),而不是依赖函数来为您完成 成功!顺便说一下,我没有提供创建树的函数的原因是它有点长。如果你认为我应该把它添加到这篇文章中,请告诉我。成功!顺便说一下,我没有提供创建树的函数的原因是它有点长。如果你认为我应该把它添加到这篇文章中,让我知道。有时候我们想得太多了,不是吗?有时候我们想得太多了,不是吗?