2
(define (delete-doubles lst)
  (cond ((null? lst) '())
        ((null? (cdr lst)) (car lst))
        ((equal? (car lst) (cadr lst)) (delete-doubles (cdr lst)))
        (else (cons (car lst) (delete-doubles (cdr lst))))))

これは私が作成したコードです。これは、この要素が2回以上連続して表示されたときに、リスト内の要素を削除するためのものです。これを除けば、コードは完全に正常に機能します。

> (delete-doubles '(1 2 2 3 4 5))
(1 2 3 4 . 5)

を削除したいのですが.、と関係があることはわかっていconsますが、解決方法がわかりません。

前もって感謝します。

4

3 に答える 3

2

'(1 2 3)本当に意味する(cons 1 (cons 2 (cons 3 null)))

'(1 2 . 3)本当に意味する(cons 1 (cons 2 3)

適切なテスト ケースがいくつかあれば、問題がすぐに明らかになるはずです。一般に、考えられる最小のテスト ケースから開始する必要があります。それから次に小さい。そしたらそこから上へ。大きな例に直接ジャンプしないでください。

于 2011-10-20T19:23:04.043 に答える
1

cdrがnullの場合、車を返すだけで、else行では、車でconsを実行し、cdrで再帰を実行しています。それがあなたのペアがどこから来ているかです。それは役に立ちますか?

于 2011-10-20T19:22:45.597 に答える
0

コードを変更せずに実行したところ、次のようになりました。

> (delete-doubles '(1))
1

意図した出力は (1) です。

これは、list-is-one-element-long-clause で間違った値を返していることを意味します。

リストに要素が 1 つある場合、すでに double はありません。つまり、この場合は (car lst) ではなく、lst を返す必要があります。

于 2011-10-22T14:07:06.350 に答える