このサンプルプログラムを動作させようとしています
(defn foo
([x] (foo x []))
([x current]
(when (> x 0)
(recur (dec x) (conj current x)))))
この関数 (foo 5) を呼び出すと、[1 2 3 4 5] が返されるはずですが、nil しか返されません。私は何を間違っていますか?
ありがとう、ムルタザ
このサンプルプログラムを動作させようとしています
(defn foo
([x] (foo x []))
([x current]
(when (> x 0)
(recur (dec x) (conj current x)))))
この関数 (foo 5) を呼び出すと、[1 2 3 4 5] が返されるはずですが、nil しか返されません。私は何を間違っていますか?
ありがとう、ムルタザ
再帰には戻り式がありません。つまり、thenwhen
が false の場合、再帰は終了し、nil が返されます。次のように使用してこれを修正できますif
。
(defn foo
([x] (foo x []))
([x current]
(if (> x 0)
(recur (dec x) (conj current x))
current)))
ベクトルを戻り値として使用している[5 4 3 2 1]
ため、これが返され、ベクトルではベクトルの末尾にアイテムが追加されます。ベクトルを逆にするか、使用する代わりにリストを使用することができます(foo 5)
conj
(foo x [])
(foo x '())
以下のコードは機能します。最終値を返していませんでした。
(defn foo
([x] (foo x []))
([x current]
(if (> x 0)
(recur (dec x) (conj current x))
current)))
(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)))))