2013-12-10 22 views
0

我在幾個小時前拿起Clojure中,我試圖得到一個斐波那契函數工作- Clojure - 我運行這個斐波那契函數時出錯,有什麼不對?

下面是函數,我定義

(defn fib [x] 
    (if (or (= x 1) (= x 2)) 
    ((inc 0)) 
     ((+ (fib (- x 1)) (fib (- x 2)))) 

)) 

,我得到這個錯誤:java.lang.Long cannot be cast to clojure.lang.IFn user/fib (NO_SOURCE_FILE:3)

雖然據我所知,我幾乎不熟悉幾乎所有的語言結構,這似乎是正確的。任何想法有什麼不對?

回答

5

你做了太多的括號中的經典錯誤,在的Lisp,括號的意思是「應用此功能」,所以重要的是要只把他們身邊的功能:

(defn fib [x] 
    (if (or (= x 1) (= x 2)) 
     1 
     (+ (fib (- x 1)) 
     (fib (- x 2))))) 

你的錯誤基本上意味着「嘿,你只是試圖申請一個號碼!「所以我們需要刪除多餘的parens。

+0

謝謝!我認爲如果表格變成if(if(condition)(iftrue)(iffalse)) – Jeroko

+1

@Jeroko Nope,在lisp中幾乎沒有任何表單包含在parans中包裝子表達式:)如果我已經提出了你的問題,請選中複選標記它如同封閉 – jozefg