语言方案,叶子标记的树木

时间:2013-11-24 22:10:24

标签: scheme racket

;;叶标记树(Llt)是以下之一:

;; *空

;; *(cons l1 l2),其中l1是非空Llt,l2是Llt

;; *(cons v l),其中v是Int,l是Llt

如何在标记为叶子的树中找到特定列表? 例如,如果我有一个参数n,我想找到哪个列表包含n。我该怎么办?

1 个答案:

答案 0 :(得分:1)

所以你有空树,'()(cons x y),其中x和y可以是整数值或子树。基本上它只是带有数字的普通列表结构?

由于这可能是作业,我只是给你一些提示:

(define (locate tree x)
  (cond ;; if it's not a pair we didn't find it
        ((not (pair? <??>)) #f)
        ;; if the car or the cdr of tree is x, return tree
        ((or (eqv? <??> <??>) (eqv? <??> <??>)) <??>)
        ;; answer must be in either the car OR the cdr
        (else (or (locate <??> x) (locate <??> x)))))

eqv?如果两者都是eq?,则为#t,这样您实际上也可以搜索树的一部分。例如

(define tree '(1 (2 (3 (4) 5 6 7 8)))) 
(locate tree 4)  ; ==> (4)
(locate tree (locate tree 4)) ; ==> ((4) 5 6 7 8)

但它仅适用于eq?的结构。例如,除非您使用equal?代替:

,否则无效
(locate tree '(4)) ; ==> #f