【发布时间】:2018-10-05 02:33:55
【问题描述】:
我需要实现一个名为 inverse-tree 的过程来接收一棵树 其节点数据值是数字和布尔值,并返回等价的 树的节点满足以下条件:
- 如果原始树的等效节点是一个数字,那么结果树的节点是-1·那个节点值
- 如果原始树的等效节点是布尔值,则结果树的节点是该节点值的逻辑非
例子:
> (inverse-tree ’())
’()
> (inverse-tree ’(5))
’(-5)
> (inverse-tree ’(0))
’(0)
> (inverse-tree ’(#f))
’(#t)
> (inverse-tree ’(#t))
’(#f)
> (inverse-tree ’(-5 (1 (-2) (3) (#f)) (#t)))
’(5 (-1 (2) (-3) (#t)) (#f))
Scheme 中树(可能为空或不完整)的表示形式如下:每个嵌套层的第一个元素表示子树的根。其余元素是子元素(当然,每个元素都是一棵树)。叶子由只有一个元素(叶子值)的列表表示。一棵完全空的树由空列表表示。
更多信息请访问Scheme altering tree values。
【问题讨论】:
-
您遇到了什么问题?穿过一棵树或其他东西?
-
我怀疑这是一个练习,你是否了解列表递归(以及
map的用处),所以你可能想复习一下。 -
如何遍历树并同时更改值?
-
如何遍历列表? (定义 (t xs) (cond ((pair?xs) (cons (car xs) (t (cdr xs)))) (else xs)))。如何遍历列表并同时更改值? (define (tc f xs) (cond ((pair?xs) (cons (... (car xs)) (tc f (cdr xs)))) (else xs))) 我怎样才能遍历一棵树并改变同时的价值观? ....
-
您转换树的方式与
map遍历列表并同时“更改”它的方式几乎相同。也就是说,您创建一个具有相同结构但具有不同值的新树。首先写下树形的可能情况(即空、叶和非空),然后定义每种情况的结果。