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