在嵌套列表中查找元素? (方案)

时间:2013-11-11 04:42:20

标签: list scheme

我正在尝试编写一个非常简单的过程来检查任意值是否是嵌套列表的元素。例如,如果列表是这样的话 (8 (4 (3 () ()) (2 () ())) (5 (13 () ()) (28 () ())))),我们要检查数字6是否是该列表的一部分,如果不是,则返回#f,如果是,则返回#t,我们将如何进行?我们不能简单地下载列表,因为我们只检索下一个列表,而不是下一个列表中的元素。我可能想过使用过滤器,但我不确定这是否是该过程的最佳方向。

2 个答案:

答案 0 :(得分:4)

以下内容应该有效

  (define (find-elem l e)
    (cond [(empty? l) #f]
          [(equal? (first l) e) #t]
          [(list? (first l)) (or (find-elem (first l) e) (find-elem (rest l)e))]
          [else (find-elem (rest l) e)]))

如果您已经习惯carcdr,则first替换carrest替换cdr

答案 1 :(得分:0)

另一个答案看起来像#!racket代码,只适用于正确的列表。这是用最新的R7RS Scheme版本编写的,应该可以使用所有列表结构。要使它在R6RS中工作,只需用注释替换两行。

#!r7rs ; #!r6rs
(import (scheme base)) ; (import (rnrs base))

(define (needle-exists? needle haystack)
  (or (equal? needle haystack) ; does this node remsemble this part of the haystack 
      (and (pair? haystack)    ; if not require pair and do car, then cdr if not found.
           (or (needle-exists? needle (car haystack)) 
               (needle-exists? needle (cdr haystack))))))

(define tree '((a b) (c . d) (e (d e a d)) . g))    

(needle-exists? '(a) tree)   ; ==> #f
(needle-exists? '(b) tree)   ; ==> #t
(needle-exists? '(a d) tree) ; ==> #t
(needle-exists? 'g tree)     ; ==> #t