2

このサンプルプログラムを動作させようとしています

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

この関数 (foo 5) を呼び出すと、[1 2 3 4 5] が返されるはずですが、nil しか返されません。私は何を間違っていますか?

ありがとう、ムルタザ

4

3 に答える 3

5

再帰には戻り式がありません。つまり、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 '())

于 2012-06-12T11:16:54.040 に答える
1

以下のコードは機能します。最終値を返していませんでした。

(defn foo
  ([x] (foo x []))
  ([x current]
     (if (> x 0)
       (recur (dec x) (conj current x))
       current)))
于 2012-06-12T11:26:25.823 に答える
-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)))))
于 2012-06-12T11:17:45.503 に答える