2012-11-06 40 views
2

也許對於大多數更先進的陰謀家的一個微不足道的問題在這裏,但作爲一個新人,我發現這是一個問題。方案列表中總是以相反的順序

我需要一種方法來構造一個新的列表即以相同的順序它是當它進來了。作爲一個例子,假設我們給出的列表「(1 2 0 3 4 0 0 5)。但是遍歷列表並將cdr作爲第一個參數傳遞回去,最終會向後構建新列表。

下面是一個代碼示例:

我通過它,需要它,一個空列表爲「新名單」所做的工作,以形成並返回一個「老名單」。

注意服用0出來就是這裏的「一定條件」,新的列表必須符合

(define (form-new-list old-list new-list) 
    (cond ((null? old-list) new-list) 
      (else 
      (if (eq? (car old-list) 0) (form-new-list (cdr old-list) new-list) 
       (form-new-list (cdr old-list) (cons (car old-list) new-list)))))) 

    ;test 
    (form-new-list '(1 2 0 3 4 0 0 5) '()) ; gives (5 4 3 2 1) 
    ;but want (1 2 3 4 5) 

我不只是想扭轉這種與反向過程返回的名單,但相反,希望新的列表首先按照正確的順序放在一起。

是否有某種「絕招」這個,喜歡做遞歸調用別的地方吧?

任何意見非常感謝。

回答

5

您正在尋找自然的方式使用遞歸遍歷一個列表。使用此程序爲您的解決方案的模板 - 它簡單的拷貝正是因爲它接收到一個列表:

(define (copy lst) 
    (if (null? lst) 
     '() 
     (cons (car lst) 
      (copy (cdr lst))))) 

注意以下幾點:

  • 時,輸入列表是空的遞歸結束,鑑於我們正在建立一個新列表,正確的返回值是空列表
  • 我們有興趣創建一個新列表,我們通過cons爲輸出列表創建一個新元素,在這種情況下正好是輸入列表的第一個元素(其car部分)
  • 最後,通過調用與輸入列表的其餘部分(其cdr部分)

像往常一樣,該過程的遞歸步驟的進步,我結束了我的答案,人們學習如何通過推薦你把遞歸認爲看看The Little SchemerHow to Design Programs,這兩本書都會教你如何使用Scheme來一般地理解遞歸過程。

+1

感謝奧斯卡。我想我錯過了你在那裏做遞歸的地方;把汽車交給cdr的程序調用。謝謝你的建議。我現在正在學習計算機程序的結構和解釋書,但會牢記這些。這個問題特別是我真正想要確定的。通常我有一個「反向」方法來處理這個問題,但是這樣好多了。再次感謝。 – Matt

+1

不客氣! SICP是一本_magnificent_書,我絕對推薦它,但對初學者來說可能有點困難。 –