2012-06-12 62 views
2

我試圖使這個示例程序工作遞歸Clojure中

(defn foo 
    ([x] (foo x [])) 
    ([x current] 
    (when (> x 0) 
     (recur (dec x) (conj current x))))) 

當我調用此函數(FOO 5),我應該得到[1 2 3 4 5],但它只返回零。我究竟做錯了什麼?

感謝, 穆爾塔扎

回答

-1

我糾正了原來的程序使用(if (= x 0)代替(when (> x 0),這將返回[1 2 3 4 5]

(defn foo 
    ([x] (foo x [])) 
    ([x current] 
    (if (= x 0) 
     (apply vector (sort < current)) 
     (recur (dec x) (conj current x))))) 
+1

由於(foo -1)返回[],Ankur響應更好。在這種情況下,您的版本將導致一個OOM。 – DanLebrero

5

您的遞歸沒有一個返回表達式即當那麼when是假的遞歸終止並返回零。你可以解決這個使用if爲:

(defn foo 
    ([x] (foo x [])) 
    ([x current] 
    (if (> x 0) 
     (recur (dec x) (conj current x)) 
     current))) 

如您使用的是矢量向量作爲返回值和conj這將爲(foo 5)返回[5 4 3 2 1]附加物品在向量的末尾。您可以扭轉的載體,或者使用列表即代替(foo x [])使用(foo x '())

+2

我通常首選首選退出條件,因爲我發現它更易於閱讀。 – DanLebrero

+0

另一種觀點可能是返回/退出的情況持續下去,因爲大多數人在查看其他語言的某些功能代碼時也習慣於這種情況:) – Ankur

1

下面的代碼工作。我沒有返回最終價值。

(defn foo 
    ([x] (foo x [])) 
    ([x current] 
    (if (> x 0) 
     (recur (dec x) (conj current x)) 
     current)))