我正在尝试使这个示例程序工作
(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)))))