我在lisp中編寫了一個遞歸減法函數,但是當我加載它並用數字運行函數時,例如(subtract 4 3)
輸出是-3
,我不明白爲什麼。遞歸減法不起作用
(defun subtract (x y)
(if (eq y 0)
x
(- 1 (subtract x (- y 1)))))
我在lisp中編寫了一個遞歸減法函數,但是當我加載它並用數字運行函數時,例如(subtract 4 3)
輸出是-3
,我不明白爲什麼。遞歸減法不起作用
(defun subtract (x y)
(if (eq y 0)
x
(- 1 (subtract x (- y 1)))))
這是你的代碼的固定版本:
(defun subtract (x y)
(if (zerop y)
x
(subtract (1- x) (1- y))))
注意,在遞歸調用我們減去1從兩個x
(實際上遞減號)和y
(得到它接近基地情況,0)。
首先,不要使用eq
來比較數字。它意外地在這種情況下工作,因爲你的數字很小。要麼使用=
,或者(因爲你正在尋找零)zerop
。
其次,你可以使用(trace subtract)
看到調用的痕跡和返回值。
三,(- 1 x)
和(- x 1)
有,在一般情況下,非常不同的值。
http://www.gregfjohnson.com/pred/ – coredump