2017-10-16 5 views
0

私はラケットの回帰を使って数字のリストを取り除こうとしています。ラケットの数字のリストの減算

(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