-1

この関数はサブリストと呼ばれますか?2つの引数(両方のリスト)を使用します。l2がl1のサブリストであるかどうかをチェックし、#tまたは#fを返します。

私はこれまでにこれを持っていますが、exists関数が正しく機能していないようです

(define (sublist? l1 l2)
  (cond ((null? l2) #t)
        ((exists l1 (car l2)) #t)
        (else (sublist? l1 (cdr l2)))))
(define (exists l p)
  (if (null? l) #f
      (or (equal? p (car l)) (exists (cdr l) p))))

更新しました

4

2 に答える 2

0

まず第一に、あなたのexists機能では、あなたには欠けていると思いますequals?

そして、最初のパラメーターはアトムであるはずのパラメーターのようですが、サブリスト関数では、最初にリストを送信し、次にアトムを送信するため、パラメーターを切り替える必要があります。

(define (exists l p)
  (if (null? l) #f
      (or (equal? p (car l)) (exists (cdr l) p))))

それはうまくいくはずです。

また、述語関数を質問として呼び出す慣習があるため、名前を付ける必要がありますexists?

[編集]

また、よく調べてみると、サブリストのように見えますか? 関数が正しくありません。リストにサブリストの要素が 1 つしか存在しない場合でも #t を返します。次のように少し変更する必要があります。

 (define (sublist? l1 l2)
  (cond ((null? l2) #t)
        ((not (exists l1 (car l2))) #f)
        (else (sublist? l1 (cdr l2)))))

今、あなたはこう言っています:

1) 空ですか?次にサブリストです。

2) この要素はリストにありませんか? そうではありません。

3) そうである場合は、残りの要素を確認します。

于 2012-09-29T18:11:52.663 に答える
0

前の回答では、サブリストではなくサブセットのみをチェックしていると思います。サブリストの順序は重要であるため、リスト内の要素の存在を単純に確認することはできません。次のようなことをする必要があります。

(define (sublist? l1 l2)
  (cond ((null? l2) #t)
        ((null? l1) #f)
        ((headlist? l1 l2) #t)
        (else (sublist? (cdr l1) l2)))

(define (headlist? l1 l2)
  (cond ((null? l2) #t)
        ((null? l1) #f)
        ((not (equal? (car l1) (car l2))) #f)
        (else headlist? (cdr l1) (cdr l2))))
于 2012-10-03T21:23:39.187 に答える