2011-10-20 8 views
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-double関数(スキーム)

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

私は.を削除したい、と私はそれがconsとは何かを持っているけど、私はそれを解決する方法がわかりません。

ありがとうございます。

答えて

1

cdrがヌルの場合、あなたは車を返すだけです。そして、else行では、carとrecursionのconsをcdrで実行しています。それであなたのペアが来る場所です。それは役に立ちますか?

2

'(1 2 3)が本当に(cons 1 (cons 2 (cons 3 null)))

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

良いテストケースのカップルはすぐに問題を明らかにするべきであることを意味します。一般に、あなたが考えることができる絶対最小のテストケースから始めなければなりません。次に小さい。それからそこから上がってください。大きな例にまっすぐジャンプしないでください。

0

私は変わらないあなたのコードを実行し、これを得た:

> (delete-doubles '(1)) 
1 

意図した出力がある(1)。

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

リストに要素が1つある場合は、すでに倍精度化されていません。 この場合、lstとnot(car lst)を返す必要があります。