clojure中的递归

clojure中的递归,clojure,Clojure,我正在努力使这个示例程序工作 (defn foo ([x] (foo x [])) ([x current] (when (> x 0) (recur (dec x) (conj current x))))) 当我调用这个函数(foo5)时,我应该得到[12345],但是它只返回nil。我做错了什么 谢谢, Murtaza您的递归没有返回表达式,即当then为false时,递归终止并返回nil。您可以使用ifas解决此问题: (defn foo ([x

我正在努力使这个示例程序工作

(defn foo
  ([x] (foo x []))
  ([x current]
     (when (> x 0)
       (recur (dec x) (conj current x)))))
当我调用这个函数(foo5)时,我应该得到[12345],但是它只返回nil。我做错了什么

谢谢,
Murtaza

您的递归没有返回表达式,即当then
为false时,递归终止并返回nil。您可以使用
if
as解决此问题:

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

这将为
(foo 5)
返回
[5 4 3 2 1]
,因为您使用vector作为返回值,并且
conj
on vector将项目追加到vector的末尾。您可以反转向量或使用列表,即代替
(foo x[])
使用
(foo x'())
我已将原始程序更正为使用
(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)))))
(defn foo
([x](foo x[]))
([x当前]
(如果(=x 0)
(应用向量(排序<当前))
(重复发生(12月x日)(联合当前x‘‘‘‘‘‘)

下面的代码有效。我没有返回最终值

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

我通常更喜欢先退出条件,因为我发现它更容易阅读。另一种观点可能是让返回/退出案例最后一个,这是大多数人在查看其他语言中的函数代码时所习惯的:)Ankur响应更好,因为(foo-1)返回[]。在这种情况下,您的版本将导致OOM。