2012-04-08 64 views
4

我在使用遞歸創建列表然後返回基本大小寫列表的方式中遇到了困難。具體來說,我將兩個32位數字(x1和x2)輸入到ALU中,然後逐位(通過ALU1)對它們進行評估,然後創建結果數字的列表。這個遞歸算法的基本情況是(null?x1),但在這一點上,我如何訪問結果列表?我知道方案中的列表是不可變的,所以我不能只創建一個空列表並將結果列表附加到列表中。任何幫助?這是我第一次進行函數式編程,所以在此先感謝。遞歸和返回計劃中的列表

(define ALU-helper 
    (lambda (selection sub x1 x2 carry-in n) 
     (if (null? x1) 
      (________?) 
      (cons 
       (ALU1 selection sub (car x1) (car x2) carry-in n) 
       (ALU-helper selection sub (cdr x1) (cdr x2) carry-in (- n 1)))))) 

回答

4

假設都x1x2有相同的長度,這應該工作:

(define ALU-helper 
    (lambda (selection sub x1 x2 carry-in n) 
    (if (null? x1) 
     '() 
     (cons 
     (ALU1 selection sub (car x1) (car x2) carry-in n) 
     (ALU-helper selection sub (cdr x1) (cdr x2) carry-in (- n 1)))))) 

當你輸入表執行遞歸,並建立一個新的輸出列表,結果,基本情況是if (null? lst)然後返回空列表'()。這是因爲在您的cons新元素的每一步都會生成結果列表;當你到達輸入列表的最後一個元素時,你已經建立了輸出列表,剩下的事情就是返回列表結束標記'()

要更清楚地看到它,請嘗試一個更簡單的示例。該過程簡單地拷貝作爲輸入接收的列表:

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

(copy '(1 2 3 4 5)) 
> (1 2 3 4 5) 

注意,再次基礎案例是if (null? lst)和遞歸步驟cons ES中的列表(car lst)的當前元素與經常性的上(cdr lst), the rest of the list. In your case, you perform ALU1`,操作的結果在兩個列表的當前元素上,當你同時遍歷兩個列表時。

+0

謝謝,當然這會很簡單!出於某種原因,如果我輸出類似'()(我認爲它只輸出'()'),我認爲構建的列表仍然不會輸出。) – Vance 2012-04-08 17:17:12

+0

@Vance歡迎您!如果這個答案對你有幫助,請考慮接受它。 – 2012-04-08 17:18:55

-1

遞歸 - 這是一個隱喻。

想象一下,你正在搬家。你有一堆需要改變的東西,你需要確保它到達新家。

得到一堆朋友填滿卡車。他們會有其他朋友可以提供幫助。軟管人員將有其他朋友等。直到它歸結爲一個人將一些東西轉移到卡車中。

現在每個人都有一點紙張來告訴你什麼是在卡車之前更多。現在你有一個列表通過收集這些紙張。

+0

謝謝,我理解遞歸的基礎知識,我只是新的計劃,並且在函數式編程方式中遇到了麻煩。我的主要問題是理解如何訪問這個新的遞歸創建列表,而無法命名該列表或將其追加到另一個我可以訪問的列表。 – Vance 2012-04-08 08:46:30

0

也許你只是想要空列表,寫成null。所以:

(if (null? x1) 
    null 
    (cons ...)) 
0

這裏是一種創建列表的新方法:基本上相反的順序。

(定義envers (拉姆達(LAT) (條件 ((空?LAT)「()) (否則(名單(envers(CDR LAT))(汽車LAT))) ) ) )