我在lisp中为递归减法编写了一个函数,但是当我加载它并运行带有数字的函数,例如( subtract 4 3 )
时,输出为-3
,我不明白为什么。
(defun subtract (x y)
(if (eq y 0)
x
(- 1 (subtract x (- y 1) ) ) ) )
答案 0 :(得分:3)
首先,不要使用eq
来比较数字。它在这种情况下意外起作用,因为你的数字很小。使用=
或(因为您正在寻找零)zerop
。
其次,您可以使用(trace subtract)
查看调用跟踪和返回值。
第三,(- 1 x)
和(- x 1)
在一般情况下具有非常不同的值。
答案 1 :(得分:2)
这是您的代码的固定版本:
(defun subtract (x y)
(if (zerop y)
x
(subtract (1- x) (1- y))))
请注意,在递归调用中,我们从中减去1 x
(实际递减数字)和y
(使其更接近基本情况,0 )。