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 回答