(define fun3
(lambda (item list)
(cond ((equal? item (car list)))
((fun3 item (cdr list)))
(else #f))))
リストにない要素を入力すると何が問題なのか知りたいです。そこにエラーが表示されます。--mcar: expects argument of type <mutable-pair>; given ()
リストの最後に到達するとどうなりますか? 次のようなリスト(1 2 3)
は、実際にはコンス セルのチェーンです。
(1 2 3) == (1 . (2 . (3 . ())))
.
を使用して左側のものを取得し、を使用car
して右側のものを取得しcdr
ます。コードで4
inを検索するとどうなるか考えてみてください。(1 2 3)
(define fun3
(lambda (item list)
(cond ((equal? item (car list)))
((fun3 item (cdr list)))
(else #f))))
item
最終的に、 is (still)4
とlist
isの場合に再帰します(3 . ())
。今、(fun3 item (cdr list))
が呼び出され、その後item
(まだ) になりますが4
、list
になります()
。はコンスセルではないため、呼び出す(car ())
ことはできません。空のリスト()
である場合を明示的に確認する必要があります。list
(define fun3
(lambda (item list)
(cond ((null? list) <...>)
((equal? item (car list)))
((fun3 item (cdr list)))
(else #f))))
さて、注意すべき点が2つあります。
これは大幅に簡素化できます。cond
いくつかのブール論理を使用して、完全に取り除くことさえできます(方法についてのいくつかのアイデアについては、Scheme を参照してください。単語がリストの一部であるかどうかを検索してください)。ここでの一般的なポイントは、C コードに類似したことを行っているということです。
if ( condition ) {
return false;
}
else {
return true;
}
これは に大幅に簡略化できますreturn !condition;
。あなたのコードがそれにどのように似ているか分かりますか? 特に、あなたの2番目のケースは(fun3 item (cdr list))
. true の場合は、true を返します。false の場合は、次のケースに進み、… false を返します。これは、単純に の値を返すことができることを意味します(fun3 item (cdr list))
。
item
の要素であるかどうかを確認したいと言ったことですが、現在のコード (空のリストの確認に関する修正を保留中)は のメンバーであるかどうかのみを確認し、 ではありませんそのサブリストのいずれか。が と等しくない場合、が別のリストである可能性があり、 に再帰して がその中にあるかどうかを確認する必要があります。ネストされたリストをスキームで検索して number を見つけると役立つかもしれませんが、その方法を正確に教えてくれるわけではありません。item
list
item
(car list)
(car list)
item
ラケットで変更可能なリスト/ペアを使用する場合は、() 構文を使用する通常のリストとは完全に別のデータ型であることを覚えておく必要があります。以下を呼び出して可変データを操作するライブラリを「リクエスト」する場合: (request scheme/mpair) そのライブラリ
から対応するプロシージャを使用するように切り替える必要があります。そうしないと、'mcons' からエラーを受信する方法がありません。
http://docs.racket-lang.org/reference/mpairs.html