13

如何在 10 行上打印 n 个列表,比如 10 个数字?我刚刚了解了循环和递归,但似乎无法将副作用(println i)(recur (+ i 1))循环形式结合起来。非常清楚:我想要这样的输出:

1
2
3
4
5
6
7
8
9
10

当 n 为 10 时。

4

5 回答 5

16

您可以为此使用doseq,这意味着在迭代涉及副作用时使用,

(doseq [i (range 10)]
   (println i))

你可以使用 map 指出,但这会产生一个充满 nil 的序列,这既不惯用又浪费资源,doseq 也不是懒惰的,所以不需要用 doall 强制它。

于 2011-06-29T17:05:58.257 回答
11

我建议这种简单循环的dotimes :

(dotimes [i 10]
  (println (inc i)))

请注意,dotimes是非惰性的,因此它适用于诸如 println 之类会引起副作用的东西。

于 2011-06-29T17:35:46.420 回答
3

使用循环/重复:

(loop [i 1]
  (when (<= i 10)
    (println i)
    (recur (inc i))))

然而,将函数 println映射到 1..10 中的数字上更为惯用(阅读:更多“Clojuristic”) 。但是因为 map 返回一个惰性序列,你必须用 doall 强制它的求值

(doall (map println (range 1 (inc 10))))
于 2011-06-29T12:41:24.637 回答
0

为了全面起见,您也可以使用 map 来做到这一点:

(doseq (map #(println %) (range 10))
于 2011-06-29T17:34:11.567 回答
0

如果您只想在屏幕上打印输出,您也可以(println i)在输入条件之前简单地放一个:

(loop [i 0]
  (println i)
  (if (< i 10)
    (recur (inc i))
    (println "done!")))

并且输出将是每行一个数字。

于 2015-07-17T00:15:30.387 回答