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。