2014-10-19 74 views
0

我是clojure以及函数式编程的新手。我试图用遍历序树:堆的预购遍历

(def tree {:left 7 :val 4 :right {:left 4 :val 3 :right 1}}) 

(defn preorder 

[tree] 

    (if 

    (nil? tree)(0) 
    (let [v (:val tree) 

     l (:left tree) 

     r (:right tree)] 

     (print-str (v (preorder l) (preorder r)))))) 

,但我得到以下异常:java.lang.ClassCastException: java.lang.Long cannot be cast to clojure.lang.IFn当我调用函数(预购树)。 任何人都可以指导我我犯了什么错误。

回答

1

(0)尝试调用0作为函数:圆括号不是用于分组,而是用于调用函数(或宏)。相反,只需编写0。同样,(v (preorder l) (preorder r))会尝试将v作为函数调用。相反,你可能想要像(str v (preorder l) (preorder r))这样的东西。

+0

谢谢我在我的代码中进行了更改,但我仍然没有得到预期的结果。输出是“40030000”。可以告诉我,如果我正确应用逻辑? – abc 2014-10-19 03:36:15

+0

你的树没有一致的结构。 ':left'和':right'只是数字,还是他们的子树?现在,你在7上递归调用你的函数,根的':left'和7的val/left/right都是零。 – amalloy 2014-10-19 03:42:24

+0

我使用maps.:left和:right创建树是子树。 – abc 2014-10-19 03:48:42