2015-10-14 52 views
0

我試圖更熟悉方案中的遞歸。我已經搜索了這個問題庫,並在方案列表中查看了許多用於查找重複條目的「內置」函數,但我試圖設計自己的函數。我還沒有學會「lambda」。我擔心的是當我調用遞歸函數時,汽車元素將被更新。我希望保持它一樣,但每次都要傳遞一個新的cdr,以便可以將原始汽車元素與列表中的每個後續元素進行比較。如果匹配,我想返回一個#t,如果沒有匹配,或者cdr是空的,則返回#f(基本大小寫)。任何幫助/建議將不勝感激。在方案列表中查找重複的元素

(define (findDuplicates list) 
    (if (null? list) 
     #f 
     (if (null? (cdr list)) 
      #f 
      (if (= (car list) (getCarOfCdr list)) 
       #t 
       (findDuplicates (cdr list)) //trying to use recursion 
      ) 
     ) 
    ) 
) 


(define (getCarOfCdr list)   //Helper function 
    (car (cdr list)) 
) 

回答

1

您應該至少使用一個內置過程使事情更簡單:member(這是標準配置)。一些一般性的建議:

  • 你不應該調用參數list,與具有相同名稱的內置函數衝突。請使用cond代替。
  • 我們只需要兩個基本情況下的這個問題,而不是三個在你的代碼。
  • getCarOfCdr是沒有必要的:它可以通過向cadr和另外一個電話,這是行不通的更換:你必須檢查每個元素對列表的所有的休息 - 這就是爲什麼你應該使用member

把所有的上述建議納入考慮,這是我提出的解決方案:

(define (findDuplicates lst) 
    (cond ((null? lst) #f) 
     ((member (car lst) (cdr lst)) #t) 
     (else (findDuplicates (cdr lst))))) 

如果使用member不能滿足你的要求,那麼它很容易實現,而且比findDuplicates簡單;你應該嘗試編寫自己的版本,只是爲了好玩。