6

2 つまたは 3 つの要素を持つリストを受け取る関数があります。

;; expecting either ((a b c) d) or ((a b c) d e)
(define (has-third-item ls)
      (if (null? (caddr ls))
          false
          true)
      )

しかし、このコードは失敗します

mcar: expects argument of type <mutable-pair>; given ()

(null? (caddr ls)) 式について。

私も試しました

(eq? '() (caddr ls))

しかし、それもうまくいきませんでした。3 番目の項目があるかどうかはどうすればわかりますか?

4

5 に答える 5

10

caddr は必要ありませんが、(if (null? (cddr ls)) が必要です ... または、 length を使用してリストの長さを見つけ、関心のある値と比較します。

リストを終了する '() は常にペアの cdr の位置にあるため、car の位置 (cad+r が行う) でそれを探すことは生産的ではありません。

于 2009-03-19T22:30:14.110 に答える
5

問題は、項目が 2 つ以下のリストがある場合、そのリストの caddr を取得できないことです。これを試して:

(define (has-third-item lst)
  (<= 3 (length lst)))

リストの長さを取得することが非効率な場合があります (数百万のアイテムを含むリストなど)。この場合、リストの長さが 0、1、または 2 であるかどうかを手動でテストできます。

(define (has-third-item lst)
  (not (or (null? lst)
           (null? (cdr lst))
           (null? (cddr lst)))))

編集:他の2 つ の回答については、入力ドメインが 2 つまたは 3 つの要素を持つリストで構成されているため、この場合は cddr を使用しても機能する可能性がありますが、0 または 1 つのリストでは has-third-item が失敗します。一般性のために、どのドメインでも機能するソリューションを使用することをお勧めします。

于 2009-03-19T22:31:51.767 に答える
1

リストに2つまたは3つの要素があることがわかっている場合(あなたが言うように)、次のことができます

(define (has-third-item? l)
  (not (null? (cddr l))))

2 番目のコンス セル(cddr l)に a があるかどうかを確認してcdrいます。より一般的な関数が必要でない限り、l 自体が null であるか、l の要素が 1 つしかないかどうかを確認する必要はありません。

于 2009-04-06T12:37:38.543 に答える
0

使ってみませんか(3番目のls)

3番目の要素、または存在しない場合はNILを返します。

于 2009-04-08T13:42:11.603 に答える
0

試す...

(and l (cdr l)(cddr l))
于 2009-04-08T11:56:22.747 に答える