我試圖使這個示例程序工作遞歸Clojure中
(defn foo
([x] (foo x []))
([x current]
(when (> x 0)
(recur (dec x) (conj current x)))))
當我調用此函數(FOO 5),我應該得到[1 2 3 4 5],但它只返回零。我究竟做錯了什麼?
感謝, 穆爾塔扎
我試圖使這個示例程序工作遞歸Clojure中
(defn foo
([x] (foo x []))
([x current]
(when (> x 0)
(recur (dec x) (conj current x)))))
當我調用此函數(FOO 5),我應該得到[1 2 3 4 5],但它只返回零。我究竟做錯了什麼?
感謝, 穆爾塔扎
我糾正了原來的程序使用(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)))))
您的遞歸沒有一個返回表達式即當那麼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 '())
我通常首選首選退出條件,因爲我發現它更易於閱讀。 – DanLebrero
另一種觀點可能是返回/退出的情況持續下去,因爲大多數人在查看其他語言的某些功能代碼時也習慣於這種情況:) – Ankur
下面的代碼工作。我沒有返回最終價值。
(defn foo
([x] (foo x []))
([x current]
(if (> x 0)
(recur (dec x) (conj current x))
current)))
由於(foo -1)返回[],Ankur響應更好。在這種情況下,您的版本將導致一個OOM。 – DanLebrero