Tree 球拍中的树褶

Tree 球拍中的树褶,tree,racket,fold,Tree,Racket,Fold,我是一名球拍初学者,我有一个问题: 定义一个结构,节点,它有以下字段:值,左,中,右。此结构表示树结构中的节点。 这些字段包含存储在节点(左子树)中的值, 分别为中间子树和右子树。如果是子树 不存在,则相应字段应包含 emptyNode如下所述 定义一个结构,emptyNode,以指定树中的空节点 编写一个函数treeFold,它将函数f、初始值initial、树结构tree作为参数。它应该 然后生成一个值,该值是使用f折叠 树中的值(使用该树中的左、中和右子树 订单)。请注意,f是一个采用两

我是一名球拍初学者,我有一个问题:

  • 定义一个结构,
    节点
    ,它有以下字段:
    。此结构表示树结构中的节点。
    这些字段包含存储在节点(左子树)中的值, 分别为中间子树和右子树。如果是子树 不存在,则相应字段应包含
    emptyNode
    如下所述
  • 定义一个结构,
    emptyNode
    ,以指定树中的空节点
  • 编写一个函数
    treeFold
    ,它将函数
    f
    、初始值
    initial
    、树结构
    tree
    作为参数。它应该 然后生成一个值,该值是使用
    f
    折叠 树中的值(使用该树中的
    子树 订单)。请注意,
    f
    是一个采用两个参数的函数。第一 参数是树中的一个值,第二个是 累积结果
函数调用应为:

(树形(lambda(a acc)(+a acc))15树)
树:

(节点7(节点5(空节点)(空节点)(空节点))
(节点20(空节点)(空节点)(空节点))
(空节点)
输出:
47

这就是我目前所做的:

(结构节点(值左中右)#:透明)
(结构emptyNode()#:透明)
(定义树)
(节点7)
(节点5(空节点)(空节点)(空节点))
(节点20(空节点)(空节点)(空节点))
(空节点)))
(定义(初始树的树倍)
(如果(emptyNode?树)
(空节点)
(节点(f初始值(节点值树))
(节点左树)
(节点中间树)
(节点右树)))
我怎样才能得到整片叶子的总数

有什么想法或帮助吗,谢谢


编辑:所以,根据答案和评论中的讨论,我得到了一个新功能,但仍然有一个错误,我找不到它。这是:

(定义(初始树的树倍)
(续)
[(空节点树)
(f)首字母0)]
[else(f(节点值树)
(f)三倍于f
(三倍f
(三倍于首字母)
(节点左树)
(节点中间树)
(节点右树)))])
你能告诉我怎么修吗?多谢各位


编辑:最终代码

(定义(初始树的树倍)
(续)
[(emptyNode?树)(f首字母0)]
[else(f(节点值树)
(三倍f
(三倍f
(三倍于首字母)
(节点左树)
(节点中间树)
(节点右树)))])

它的工作原理与我预期的一样

在使用新版本的函数编辑问题后进行更新

这是朝着正确方向迈出的一步。里面有一些正确的片段,也有一些不正确的片段

功能就像可以连接在一起的盒子。东西通过一些电线进入,然后通过其他电线流出。每个盒子都有其正确的使用方式:电线的数量,以及它期望流入其中的东西

您的新版本:

(define (treeFold f initial tree) 
  (cond 
    [(emptyNode? tree) 
          (f initial 0)] 
    [else (f (node-value tree)                 ;; (1)
             (f (treeFold f                    ;; (2)
                   (treeFold f 
                      (treeFold f initial 
                         (node-left tree)) 
                      (node-middle tree)) 
                    (node-right tree))))]))
f
需要两个参数<代码>(f首字母0)至少在这方面看起来是正确的。调用
(1)
。但是在
(2)
处对
f
的调用只有一个参数提供给
f
,因此这不可能是正确的

其次,是它的含义。对
treeFold
的三个嵌套调用几乎是正确的:我们“进入”到
(节点左树)
,即左子树,以
initial
作为初始值,然后我们从中得到结果,并将其作为新的初始值进入中间子树,并使用计算结果遍历右子树。美好的我们完成了。这就是我们需要的最终结果——无需进一步将其输入
f
。因此,对
f
的两个调用,以及对
treeFold
的三个嵌套调用,根本不需要

除了,我们如何处理
(节点值树)
?它在哪里合适?答案是,它应该通过调用
f
,与
初始值
组合,并且应该将其结果用作初始值,我们使用它遍历左子树;开始折叠的值

基本情况也不正确。我们已经有了
首字母
,为什么突然需要将它与
0
组合起来?为什么
0
?例如,我们可以在一棵树上折叠字符串,将字符串与数字
0
组合在一起就没有什么意义了

否,
0
将作为调用
treeFold
的初始值提供,如

(define (sumAllNumbersInWholeTree tree)
  (treeFold + 0 tree))
通过带树的字符串,我们可以定义

(define (collectAllStringsInWholeTree tree)
  (treeFold string-append "" tree))
答案的初始版本如下。用你的新理解回顾一下它的(经过轻微编辑的)示例。:)


为了

(定义树
(节点7)
(节点5(空节点)(空节点)(空节点))
(节点20(空节点)(空节点)(空节点))
(空节点)))
它必须是,根据规范

47==(树前+15树)
==(三倍+15
(节点7)
(节点5(空节点)(空节点)(空节点))
(节点20(空节点)(空节点)(空节点))
(空节点)))
==(三倍+
(三倍+
(三倍+(+15 7)
(节点5(空节点)(空节点)(