2017-10-16 187 views
0

我試圖在球拍中使用recurssion來減去數字列表。功能如下:減去球拍中的數字列表

(define (sub lst) 
(cond [(empty? lst) 0] 
     [ else (- (first lst) (sub (rest lst)))])) 

這似乎並不正確,因爲球拍從左到右執行減法。即,例如:

(- 1 2 3 4 6)假定爲-14。但是當我以與通過遞歸方式給列表一樣的方式進行操作時,像(list 1 2 3 4 6)那樣給出結果爲4.我該如何解決這個問題?

回答

1

所以,你的功能做到這一點:

(sub '(1 2 3))  ; == 
(- 1 (- 2 (- 3 0))) ; == 
(- 1 (- 2 3))  ; == 
(- 1 -1)   ; == 
; ==> 2 

你函數需要做的是這樣的:

(- (- 1 2) 3) ; ==> -4 

還爲0和1的說法特殊情況:

(sub '()) ; ==> 0 (identity of - is 0) 
(sub '(1)) ; ==> -1 (- identity 1) 
+0

謝謝。我知道了。所以遞歸需要改變? – user3607109

+0

@ user3607109是的。操作需要從左到右發生,而不是像你做的那樣從右向左發生。 – Sylwester