【发布时间】:2021-02-07 01:10:36
【问题描述】:
我是 Racket 的初学者,我收到了这个问题:
- 定义一个结构
node,它具有以下字段:value、left、middle、right。此结构表示树结构中的节点。
这些字段包含存储在节点中的值,左子树, 分别是中间子树和右子树。如果一个子树 不存在,那么对应的字段应该包含一个emptyNode如下所述。- 定义一个结构
emptyNode,以指定树中的一个空节点。- 编写一个函数
treeFold,它接受一个函数f、一个初始值initial和一个树结构tree作为参数。这应该 然后产生一个值,这是使用f折叠的结果 树中的值(在其中使用left、middle和right子树 命令)。请注意,f是一个接受 两个 参数的函数。首先 参数是树中的一个值,第二个是部分 累积结果。
函数调用应该是:
(treeFold (lambda (a acc) (+ a acc)) 15 tree)
树:
(node 7 (node 5 (emptyNode) (emptyNode) (emptyNode))
(node 20 (emptyNode) (emptyNode) (emptyNode))
(emptyNode))
输出:47
这是我到目前为止所做的:
(struct node (value left middle right) #:transparent)
(struct emptyNode () #:transparent)
(define tree
(node 7
(node 5 (emptyNode) (emptyNode) (emptyNode))
(node 20 (emptyNode) (emptyNode) (emptyNode))
(emptyNode)))
(define (treeFold f initial tree)
(if (emptyNode? tree)
(emptyNode)
(node (f initial (node-value tree))
(node-left tree)
(node-middle tree)
(node-right tree))))
我怎样才能得到整片叶子的总数?
任何想法或帮助,谢谢
编辑:因此,根据其 cmets 中的答案和讨论,我得到了一个新功能,但仍然存在错误,我找不到它。在这里:
(define (treeFold f initial tree)
(cond
[(emptyNode? tree)
(f initial 0)]
[else (f (node-value tree)
(f (treeFold f
(treeFold f
(treeFold f initial
(node-left tree))
(node-middle tree))
(node-right tree))))]))
你能告诉我如何解决它吗?谢谢。
编辑:最终代码
(define (treeFold f initial tree)
(cond
[(emptyNode? tree) (f initial 0)]
[else (f (node-value tree)
(treeFold f
(treeFold f
(treeFold f initial
(node-left tree))
(node-middle tree))
(node-right tree)))]))
它按我的预期工作
【问题讨论】:
-
您的新代码仍有问题。正如我在答案中讨论的那样,
collectAllStringsInWholeTree将无法在其下工作。无需在空节点上将initial与0组合在一起。为什么0?如果我们正在处理的是字符串怎么办?只需initial就足够了。除此之外,做得很好。 :) 它定义了树的后序遍历,而我的回答建议使用前序遍历。我想两者都可以,因为要求中没有指定。但由于它被命名为“初始”,我希望预购是预期的。否则它会被命名为“final”之类的。 -
带数字和
+没关系,但如果是-呢?或带有string-append的字符串?那么一般来说,预折叠和后折叠的结果会有所不同。即(treeFold - 100 tree)应该返回68,我认为。