【问题标题】:Tree map function in SchemeScheme中的树图函数
【发布时间】:2013-10-26 06:18:52
【问题描述】:

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

【问题讨论】:

    标签: recursion map scheme binary-tree binary-search-tree


    【解决方案1】:

    这段代码真的很复杂。首先,我没有看到 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))))))
    

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

    【讨论】:

    • 有时候我们想得太多了,不是吗?
    【解决方案2】:

    似乎有几个错误:

    • 如果找到叶节点,则说明您没有将函数应用于该节点
    • 缺少节点同时具有两个子树的情况
    • 函数应用的部分错误

    用你的一个示例试试这个,这个问题不包括我自己测试它的所有必要代码:

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

    【讨论】:

    • 成功!顺便说一句,我没有提供创建树的功能的原因是它有点长。如果您认为我应该将其添加到此帖子中,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多