2016-12-16 58 views
0

我在lisp中編寫了一個遞歸減法函數,但是當我加載它並用數字運行函數時,例如(subtract 4 3)輸出是-3,我不明白爲什麼。遞歸減法不起作用

(defun subtract (x y) 
    (if (eq y 0) 
    x 
    (- 1 (subtract x (- y 1))))) 
+0

http://www.gregfjohnson.com/pred/ – coredump

回答

2

這是你的代碼的固定版本:

(defun subtract (x y) 
    (if (zerop y) 
    x 
    (subtract (1- x) (1- y)))) 

注意,在遞歸調用我們減去1從兩個x(實際上遞減號)和y(得到它接近基地情況,0)。

3

首先,不要使用eq來比較數字。它意外地在這種情況下工作,因爲你的數字很小。要麼使用=,或者(因爲你正在尋找零)zerop

其次,你可以使用(trace subtract)看到調用的痕跡和返回值。

三,(- 1 x)(- x 1)有,在一般情況下,非常不同的值。