我写了一个像这样的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.
这里发生了什么?如果我给它两个论点,它认为我给了它一个。如果我给它三,它认为我给它三。如果我给它一个,它认为我给了它一个......
答案 0 :(得分:11)
递归调用只有一个参数:
(power (- exponent 1))
应该是这样的:
(power base (- exponent 1))
答案 1 :(得分:6)
递归调用是你的问题。你忘了把基数作为第一个参数传递。
(* base (power (- exponent 1)))))
应该是:
(* base (power base (- exponent 1)))))
答案 2 :(得分: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函数编译在Listener中输入的定义。或者,您可以在编辑器窗口中键入定义并从那里编译(通过编译文件,缓冲区或表达式)。 LispWorks还具有查找发生错误的代码的功能。
答案 3 :(得分:1)
Lisp附带函数expt
,因此无需定义自己的函数。
(除非这是练习或家庭作业,在这种情况下,您可能希望查看更有效的方法,例如exponentiation by squaring。)