如何在 10 行上打印 n 个列表,比如 10 个数字?我刚刚了解了循环和递归,但似乎无法将副作用(println i)
与(recur (+ i 1))
循环形式结合起来。非常清楚:我想要这样的输出:
1
2
3
4
5
6
7
8
9
10
当 n 为 10 时。
您可以为此使用doseq,这意味着在迭代涉及副作用时使用,
(doseq [i (range 10)]
(println i))
你可以使用 map 指出,但这会产生一个充满 nil 的序列,这既不惯用又浪费资源,doseq 也不是懒惰的,所以不需要用 doall 强制它。
我建议这种简单循环的dotimes :
(dotimes [i 10]
(println (inc i)))
请注意,dotimes是非惰性的,因此它适用于诸如 println 之类会引起副作用的东西。
使用循环/重复:
(loop [i 1]
(when (<= i 10)
(println i)
(recur (inc i))))
然而,将函数 println映射到 1..10 中的数字上更为惯用(阅读:更多“Clojuristic”) 。但是因为 map 返回一个惰性序列,你必须用 doall 强制它的求值:
(doall (map println (range 1 (inc 10))))
为了全面起见,您也可以使用 map 来做到这一点:
(doseq (map #(println %) (range 10))
如果您只想在屏幕上打印输出,您也可以(println i)
在输入条件之前简单地放一个:
(loop [i 0]
(println i)
(if (< i 10)
(recur (inc i))
(println "done!")))
并且输出将是每行一个数字。