我需要实现一个名为inverse-tree的过程来接收树 其节点数据值是数字和布尔值并返回等价物 节点满足以下条件的树:
示例:
> (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中(可能为空或非完整)树的表示如下:每个嵌套级别中的第一个元素表示子树的根。其余的元素是孩子(当然,每个孩子都是树)。叶子由仅包含一个元素的列表(叶子值)表示。一个完全空的树由空列表表示。
答案 0 :(得分:2)
记下可能的输入(在树的描述中有三种情况)并为每种情况定义结果。
以下是您需要实现的常规树遍历:
您可能希望在自己喜欢的Scheme书中阅读map
。
有可能(但我怀疑这是后来的练习)来概括这一点,以便它在树中应用任意函数,就像map
对列表一样。
答案 1 :(得分:1)
树结构的解释似乎不起作用。 (1 (-2) (3)
是一个节点,但1
不是父节点。但是,您似乎可以将整个事物看作二叉树,其中对是节点,空列表是空树,任何其他值都是叶节点。
抽象看起来像这样:
(define make-tree cons)
(define tree-left car)
(define tree-right cdr)
(define tree? pair?)
(define empty-tree '())
您可以映射树的值,如下所示:
(define (map-tree proc tree)
(cond ((eq? empty-tree tree) empty-tree)
((tree? tree)
(make-tree (map-tree proc (tree-left tree))
(map-tree proc (tree-right tree))))
(else (proc tree))))
示例:
(map-tree (lambda (v) (+ v 1)) '(1 (2) 3))
; ==> (2 (3) 4)
显然,您需要使用如下所示的过程替换第一个参数:
(inverse #f) ; ==> #t
(inverse #t) ; ==> #f
(inverse 5) ; ==> -5
;; optional
(inverse 'xxx) ; ==> xxx
然后,您可以轻松完成手术:
(define (inverse-tree tree)
(map-tree inverse tree))
(inverse-tree ’(-5 (1 (-2) (3) (#f)) (#t)))
; ==> (5 (-1 (2) (-3) (#t)) (#f))
现在,如果您不能使用抽象,则需要使用替换规则。例如。
(define (tree-inc v)
(map-tree (lambda (v) (+ v 1)) v))
; ==
(define (tree-inc tree)
(cond ((eq? '() tree) '())
...
(else (+ (car tree) 1))))
你有它。比使用抽象的更难以阅读和推理。祝你好运。
答案 2 :(得分:1)
经过大量挖掘和理解语法后,我提出了一个简单的1函数解决方案:
(define (inverse-tree tree)
(cond ((eq? '() tree) '())
((pair? tree)
(cons (inverse-tree (car tree))
(inverse-tree (cdr tree))))
(else ((lambda(x) (if (boolean? x) (not x) (- x))) tree))))
答案 3 :(得分:1)
我认为应该有效:
(define inverse-tree
(lambda (tree)
(if (null? tree)
'()
(if (number? (car tree))
(cons (* -1 (car tree)) (inverse-tree (cdr tree)))
(if (boolean? (car tree))
(cons (not (car tree)) (inverse-tree (cdr tree)))
(cons (inverse-tree (car tree)) (inverse-tree (cdr tree))))))))