递归减法不起作用

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).