2017-10-16 192 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