0

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

4

2 回答 2

5

以下应该工作

  (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)]))

如果您习惯carand cdrthan 你有替换firstbycarrestby cdr

于 2013-11-11T04:53:29.623 回答
0

另一个答案看起来像#!racket代码,只适用于正确的列表。这是用最新的 R7RS 方案版本编写的,应该可以使用所有列表结构。要使其在 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
于 2013-11-11T23:21:23.843 回答