递归减法不起作用

时间:2016-12-16 09:11:02

标签: recursion lisp clisp

我在lisp中为递归减法编写了一个函数,但是当我加载它并运行带有数字的函数,例如( subtract 4 3 )时,输出为-3,我不明白为什么。

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

2 个答案:

答案 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 )。