2010-11-19 107 views
3

我寫這樣一個Lisp函數: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. 

這是怎麼回事?如果我給出兩個論點,它認爲我給了它一個。如果我給它三個,它認爲我給了它三個。如果我給它一個,它認爲我給它一個...

回答

10

這是遞歸調用只有一個參數:

(power (- exponent 1)) 

它應該是這樣的:

(power base (- exponent 1)) 
6

遞歸調用是你的問題。作爲第一個參數,你忘記了通過基礎。

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

應該是:

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

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 Listener(REPL)不會編譯。您必須使用函數COMPILE編譯您在Listener中輸入的定義。或者,您可以將定義輸入編輯器窗口並從那裏編譯(通過編譯文件,緩衝區或表達式)。 LispWorks還具有查找發生錯誤的代碼的功能。

1

Lisp自帶功能expt,所以不需要自己定義。

(除非這是一項練習或作業,在這種情況下,您可能需要查看更有效的方法,例如exponentiation by squaring。)