4

我写了一个这样的 Lisp 函数:

(defun power (base exponent)
  (if (= exponent 0)
      1
    (* base (power (- exponent 1)))))

但是,当我尝试调用它时,会出现一些错误:

CL-USER 2 > (power 2 3)

Error: POWER got 1 arg, wanted at least 2.
  1 (abort) Return to level 0.
  2 Return to top loop level 0.

Type :b for backtrace or :c <option number> to proceed.
Type :bug-form "<subject>" for a bug report template or :? for other options.

CL-USER 3 : 1 > (power 2)

Error: POWER got 1 arg, wanted at least 2.
  1 (abort) Return to level 1.
  2 Return to debug level 1.
  3 Return to level 0.
  4 Return to top loop level 0.

Type :b for backtrace or :c <option number> to proceed.
Type :bug-form "<subject>" for a bug report template or :? for other options.

CL-USER 4 : 2 > (power 2 3 4)

Error: POWER got 3 args, wanted 2.
  1 (continue) Ignore the extra arg.
  2 (abort) Return to level 2.
  3 Return to debug level 2.
  4 Return to level 1.
  5 Return to debug level 1.
  6 Return to level 0.
  7 Return to top loop level 0.

Type :b for backtrace or :c <option number> to proceed.
Type :bug-form "<subject>" for a bug report template or :? for other options.

这里发生了什么?如果我给它两个论点,它认为我给了它一个。如果我给它三个,它认为我给了它三个。如果我给它一个,它认为我给它一个......

4

4 回答 4

11

这是只有一个参数的递归调用:

(power (- exponent 1))

它应该是这样的:

(power base (- exponent 1))
于 2010-11-19T04:52:48.187 回答
6

递归调用是你的问题。您忘记将基数作为第一个参数传入。

(* base (power (- exponent 1)))))

应该:

(* base (power base (- exponent 1)))))

于 2010-11-19T04:54:21.183 回答
3

编译你的函数。在 LispWorks 中使用 c-sh-c 在编辑器中编译定义。

在 REPL 中:

CL-USER 18 > (defun power (base exponent)
               (if (= exponent 0)
                   1
                 (* base (power (- exponent 1)))))
POWER

CL-USER 19 > (compile 'power)
;;;*** Warning in POWER: POWER is called with the
;;;    wrong number of arguments: Got 1 wanted 2

编译器会告诉你代码有问题。

请注意,LispWorks 侦听器(REPL)不会编译。您必须使用函数 COMPILE 编译您在侦听器中输入的定义。或者,您可以将定义键入编辑器窗口并从那里编译(通过编译文件、缓冲区或表达式)。LispWorks 还具有定位发生错误的代码的功能。

于 2010-11-19T12:02:10.403 回答
1

Lisp自带函数expt,不需要自己定义。

(除非这是一个练习或家庭作业,在这种情况下,您可能需要查看更有效的方法,例如通过平方求幂。)

于 2010-11-19T12:15:53.910 回答