2011-10-20 75 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)))))) 

這是我所做的代碼。它意味着當這個元素出現兩次或更多次之後,在列表中刪除一個元素。該代碼工作完全正常,除了這一點:刪除雙打功能(方案)

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

我想刪除.,我知道這事做與cons,但我不知道如何解決它。

在此先感謝。

回答

1

當cdr爲null時,您剛剛返回汽車,而在else行中,您正在對car和carr進行遞歸操作。這就是你們倆來自哪裏。這有幫助嗎?

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。

如果列表有一個元素,那麼它已經沒有雙打。 也就是說,在這種情況下,您必須返回lst而不是(car lst)。