2014-10-19 71 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