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に慣れている場合は、andにcdr置き換えます。firstcarrestcdr

于 2013-11-11T04:53:29.623 に答える
0

他の答えはコードのように見え#!racket、適切なリストでのみ機能します。これは最新の R7RS Scheme バージョンで書かれており、すべてのリスト構造で動作するはずです。R6RS で機能させるには、最初の 2 行をコメントに置き換えるだけです。

#!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 に答える