2012-09-26 123 views
-2
 
(define (checksum-2 ls) 
    (if (null? ls) 
     0 
     (let ([n 0]) 
     (+ (+ n 1))(* n (car ls))(checksum-2 (cdr ls))))) 

好吧,我有這個代碼,它假設,如果我寫它的權利,數量(n)應該增加一次,每次它通過列表,所以n(在現實)應該像1 2 3 4,但我希望n乘以列表中的汽車。沒有返回我需要的答案

一切都加載,但當答案返回時,我得到0.

謝謝!

回答

1

如果您不同格式的代碼,你可能有一個更簡單的時間看到正在發生的事情:

(define (checksum-2 ls) 
    (if (null? ls) 
     0 
     (let ([n 0]) 
     (+ (+ n 1)) 
     (* n (car ls)) 
     (checksum-2 (cdr ls))))) 

裏面的let形式,表達是按順序進行評估,但你不使用的結果他們中的任何一個(除了最後一個)。加法和乘法的結果簡單地被丟棄。

你在這種情況下需要做的是定義一個新的輔助函數,它使用累加器並執行遞歸調用。我會猜測這是作業或學習練習,所以我不會放棄完整的答案。

UPDATE:作爲之類的事情的演示中,您可能需要做的,這裏是一個類似的功能在計劃總結整數從1n

(define (sum n) 
    (define (sum-helper n a) 
    (if (<= n 0) 
     a 
     (sum-helper (- n 1) (+ a n)))) 
    (sum-helper n 0)) 

您應該能夠使用類似的框架來實現您的checksum-2函數。

+0

嗯,你看,我不知道如何去這樣做。我沒有得到的是爲什麼我的函數忽略數學,只是返回0? –

+0

你沒有對算術計算的結果做任何事情。你的'checksum-2'函數可以返回的惟一值就是'0',或者任何'(checksum-2(cdr ls))'返回的值。所以最終它總是返回'0'。 –

+0

那麼需要改變什麼?就像我一直在這裏呆了幾個小時,而且我沒有到任何地方。這是遞歸調用的東西? –