2011-03-07 105 views
2

編寫遞歸方案過程count-dist元素,該元素接受具有重複元素的列表並返回列表中不同元素的數量。計算方案中的獨特元素

這是我的代碼,但它不能正常工作。請幫忙!謝謝!!

(define (count-dist-elements lis) 
    (cond 
    ((null? lis) 0) 
    ((null? (cdr lis))0) 
    ((member (car lis)(cdr lis))) 
    (else(+ 1(count-dist-elements (cdr lis)))))) 

P/S:讓它成爲(計數DIST元素 '(1 2 1 1 2 3 4 5 5 6 6 7 7 8 8 8 9))

+1

我不認爲這有什麼與你的困難,但你的代碼是不是很正確縮進。如果這反映了它的實際外觀,並且不僅僅是將它輸入到Stack Overflow時出現的一個小問題,我強烈建議你養成* always *縮進的習慣並小心地分隔代碼?這會讓閱讀變得更容易(對於你自己和他人),並且會犯一些更難以忽略的錯誤。 – 2011-03-07 23:29:20

回答

1

看起來你'重新接近。

  • 當您將函數傳遞給一個元素時會發生什麼?在這種情況下,你的函數應該返回什麼?
  • 那麼具有相同元素的兩元素列表(例如(5 5))呢?你的函數是否會返回一個合理的值?
+0

如果一個元素,那麼計數將爲1. 如果是具有2個相同元素的列表,則它也將爲1。但是如果我想在那裏傳遞一個更長的列表。我在代碼中還缺少什麼? – 2011-03-07 23:35:57

+1

@Melissa:你的分析是正確的,但是你的功能實際上並不是這樣工作的。你將需要修復你的功能。 – 2011-03-07 23:42:00

0

第一:爲什麼你在(null? (cdr lis))的情況下歸零?

第二:如果第一個元素也出現在列表後面,那麼您認爲您的代碼返回了什麼?你確定?

0
(define (count-dist-elements lst dist-elems count) 
    (cond ((null? lst) count) 
     ((member (car lst) dist-elems) 
      (count-dist-elements (cdr lst) dist-elems count)) 
     (else 
      (count-dist-elements (cdr lst) 
           (cons (car lst) dist-elems) 
           (+ 1 count))))) 

(count-dist-elements '(a b b c) '() 0) ==>3

(count-dist-elements '(1 2 1 1 2 3 4 5 5 6 6 7 7 8 8 8 9) '() 0) ==>9

或者,如果你想它遞歸迭代沒有(和,它使用函數調用像所示) ,

(define (count-dist-elements lst . dist-elems) 
    (let ((dist-elems (if (null? dist-elems) '() (car dist-elems)))) 
    (cond ((null? lst) 0) 
      ((member (car lst) dist-elems) 
      (count-dist-elements (cdr lst) dist-elems)) 
      (else 
      (+ 1 (count-dist-elements (cdr lst) (cons (car lst) dist-elems))))))) 

給出了相同的結果。

(count-dist-elements '(1 2 1 1 2 3 4 5 5 6 6 7 7 8 8 8 9)) ==>9