0
(define fun3
  (lambda (item list) 
    (cond ((equal? item (car list))) 
          ((fun3 item (cdr list)))
          (else #f))))

リストにない要素を入力すると何が問題なのか知りたいです。そこにエラーが表示されます。--mcar: expects argument of type <mutable-pair>; given ()

4

2 に答える 2

1

リストの最後に到達するとどうなりますか? 次のようなリスト(1 2 3)は、実際にはコンス セルのチェーンです。

(1 2 3) == (1 . (2 . (3 . ())))

.を使用して左側のものを取得し、を使用carして右側のものを取得しcdrます。コードで4inを検索するとどうなるか考えてみてください。(1 2 3)

(define fun3
  (lambda (item list) 
    (cond ((equal? item (car list))) 
          ((fun3 item (cdr list)))
          (else #f))))

item最終的に、 is (still)4listisの場合に再帰します(3 . ())。今、(fun3 item (cdr list))が呼び出され、その後item(まだ) になりますが4listになります()。はコンスセルではないため、呼び出す(car ())ことはできません。空のリスト()である場合を明示的に確認する必要があります。list

(define fun3
  (lambda (item list) 
    (cond ((null? list) <...>)
          ((equal? item (car list))) 
          ((fun3 item (cdr list)))
          (else #f))))

さて、注意すべき点が2つあります。

  1. これは大幅に簡素化できます。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))

  2. より重要な問題は、 が listまたはそのサブリストのいずれかitemの要素であるかどうかを確認したいと言ったことですが、現在のコード (空のリストの確認に関する修正を保留中)は のメンバーであるかどうかのみを確認し、 ではありませんそのサブリストのいずれか。が と等しくない場合、が別のリストである可能性があり、 に再帰して がその中にあるかどうかを確認する必要があります。ネストされたリストをスキームで検索して number を見つけると役立つかもしれませんが、その方法を正確に教えてくれるわけではありません。itemlistitem(car list)(car list)item
于 2013-10-14T23:37:01.480 に答える
0

ラケットで変更可能なリスト/ペアを使用する場合は、() 構文を使用する通常のリストとは完全に別のデータ型であることを覚えておく必要があります。以下を呼び出して可変データを操作するライブラリを「リクエスト」する場合: (request scheme/mpair) そのライブラリ
から対応するプロシージャを使用するように切り替える必要があります。そうしないと、'mcons' からエラーを受信する方法がありません。 http://docs.racket-lang.org/reference/mpairs.html

于 2015-01-29T16:19:45.980 に答える