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(空节点)(空节点)(