(define-struct sample [color upper lower])
(define v (make-sample 'brown empty empty))
(define w (make-sample 'blue empty empty))
(define x (make-sample 'green v w))
(define y (make-sample 'orange empty empty))
(define z (make-sample 'blue x y))
我试图创建一个函数颜色列表,它采用一个样本并返回其树中所有颜色的符号列表。 例如
;(color-lst z) should return (list 'blue 'green 'brown 'blue 'orange))
我将如何做到这一点?
答案 0 :(得分:1)
为此,您需要使用pre-order traversal遍历树,负责正确创建输出列表。遵循树遍历的标准模板很容易,您只需要知道 where 来调用递归以及放置当前元素的位置。我会给你一些提示,不会破坏达到你自己答案的乐趣。填写空白:
(define (color-lst tree)
(if (empty? tree) ; if the tree is empty
<???> ; it's the base case for building an output list
(append (cons <???> ; else add current element
(color-lst <???>)) ; recurse on one side
(color-lst <???>)))) ; and then on the other
如果一切正常,它应该按预期工作:
(color-lst z)
=> '(blue green brown blue orange)
答案 1 :(得分:0)
您可以使用递归函数相当简单地完成此操作。
; sample? -> (listof symbol?)
(define (color-lst sample)
(cond
[(sample? sample)
(cons (sample-color sample)
(append (color-lst (sample-upper sample))
(color-lst (sample-lower sample))))]
[(empty? sample) sample]
[else (raise-argument-error 'color-lst "(or/c symbol? null?)" sample)]))
(color-lst z)
; => '(blue green brown blue orange)
这可以通过遍历符号树并构建列表来实现。如果它没有找到其中一个树节点的符号或空列表,它将失败并显示格式错误的错误消息。