2013-12-10 19 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