使用新版本的函数编辑问题后进行更新。
这是朝着正确方向迈出的一步。其中有一些正确的部分,也有一些不正确的部分。
函数就像可以连接在一起的盒子。有些电线上有东西进来,有些电线上有东西出去。每个盒子都有其正确的使用方式:电线的数量以及预期流入其中的物质。
您的新版本:
(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 initial 0)
looks是的,至少在这方面。来电(1)
以及。但是调用f
at (2)
仅提供一个参数f
,所以不可能是正确的。
接下来说说它的含义。三个嵌套调用treeFold
are almost右:我们“进入”(node-left tree)
,即左子树,其中initial
作为初始值,然后我们从中得到结果并使用it作为新的初始值进入中间子树,并使用计算结果遍历右子树。好的。是done。那就是final我们需要的结果——不需要将其输入f
任何进一步。所以这两个电话f
上面的三个嵌套调用treeFold
根本不需要。
除此之外,我们该怎么办(node-value tree)
?它适合在哪里?答案是,它应该与initial
值,通过调用方式f
,以及result of that应该用作我们遍历的初始值left子树;我们的价值start折叠。
基本情况也是不正确的。我们已经拥有了initial
,为什么我们需要将它与0
突然间?以及为什么0
?我们可以折叠在一棵树上strings,例如,将字符串与数字组合0
没有多大意义。
No, 0
将会supplied作为调用中的初始值treeFold
, like
(define (sumAllNumbersInWholeTree tree)
(treeFold + 0 tree))
有了带弦的树,我们可以例如定义
(define (collectAllStringsInWholeTree tree)
(treeFold string-append "" tree))
答案的初始版本如下。用你的新理解回顾一下它的(稍微编辑过的)示例。 :)
For
(define tree
(node 7
(node 5 (emptyNode) (emptyNode) (emptyNode))
(node 20 (emptyNode) (emptyNode) (emptyNode))
(emptyNode)))
根据规格,它必须是
47 == (treeFold + 15 tree)
== (treeFold + 15
(node 7
(node 5 (emptyNode) (emptyNode) (emptyNode))
(node 20 (emptyNode) (emptyNode) (emptyNode))
(emptyNode)))
== (treeFold +
(treeFold +
(treeFold + (+ 15 7)
(node 5 (emptyNode) (emptyNode) (emptyNode)))
(node 20 (emptyNode) (emptyNode) (emptyNode)))
(emptyNode))
== (treeFold +
(treeFold +
(treeFold +
(treeFold +
(treeFold + (+ 22 5) (emptyNode))
(emptyNode))
(emptyNode))
(node 20 (emptyNode) (emptyNode) (emptyNode)))
(emptyNode))
== (treeFold +
(treeFold +
(treeFold +
(treeFold + 27
(emptyNode))
(emptyNode))
(node 20 (emptyNode) (emptyNode) (emptyNode)))
(emptyNode))
== (treeFold +
(treeFold +
(treeFold + 27
(emptyNode))
(node 20 (emptyNode) (emptyNode) (emptyNode)))
(emptyNode))
== (treeFold +
(treeFold + 27
(node 20 (emptyNode) (emptyNode) (emptyNode)))
(emptyNode))
.........
(写作==
为“等于”)。这已经为您提供了完整定义所需的一切,即
(treeFold + i (node v lt md rt))
==
(treeFold +
(treeFold +
(treeFold + (+ i v) lt)
md)
rt)
and
(treeFold + i (emptyNode))
==
i