需要 Clojure 中任何数字的前 10 个倍数
Need the first 10 multiples of any number in Clojure
我们的任务是打印我们编写了以下代码的任何数字的前十个倍数。它正在抛出一个错误。简单来说,如果 n 是 2 那么我们需要创建一个 table 的 2 到 10.
(defn multiples [n]
(while ( n < 11)
(println( n * n))
(swap! n inc)))
(def n (Integer/parseInt (clojure.string/trim (read-line))))
(multiples n)
有了这个,我们得到了错误:
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to clojure.lang.
(defn multiples [n]
(map #(* n %) (range 1 (+ 10 1))))
user=> (multiples 1)
;; => (1 2 3 4 5 6 7 8 9 10)
user=> (multiples 2)
;; => (2 4 6 8 10 12 14 16 18 20)
您可以遍历的结果列表和 println
每个元素。
(for [i (multiples 2)]
(println i))
;; or:
(map println (multiples 2)) ;; though one usually doesn't apply
;; `map` on side effect functions ...
改进你自己的构造:
您来自命令式语言,尝试使用突变。
这是非常不惯用的 clojure。
但是,通过声明一个值原子,您可以使用 @
运算符访问它的位置。并改变变量的值。
(defn multiples [n]
(let [i (atom 1)] ;; i is an atom
(while (< @i 11) ;; @i is the value saved into i
(println (* @i n))
(swap! i inc)))) ;; and correctly you can increase the value
有了这个倍数,还可以打印数值。
您不能将 swap!
应用于普通变量,只能应用于原子。
while
循环只有在元素数量未知时才适用。
在这种情况下,人们非常清楚何时停止。所以宁可使用
for
循环。
(defn multiples [n]
(for [i (range 1 11)]
(println (* i n))))
看看 iterate 函数做了什么 here
(defn multiples-of [n]
(iterate (partial * n) n))
(def ten-multiples-of-ten
(take 10 (multiples-of 10)))
编辑:我误读了问题的作者,我相信他只想生成一系列正方形。这是使用传感器的一种方法,为什么不呢 ;)
(def xf
(comp
(map inc)
(map #(* % %))))
(defn first-n-squares [n]
(into [] xf (take n (range))))
您可以在循环中使用 recur
:
(defn multiples [n]
(if (< n 11)
(do ; then
(println (* n n))
(recur (inc n)))
nil)) ; else return nil
运行 通过调用
(multiples 1)
在 REPL 中将产生
1
4
9
16
25
36
49
64
81
100
nil
我们的任务是打印我们编写了以下代码的任何数字的前十个倍数。它正在抛出一个错误。简单来说,如果 n 是 2 那么我们需要创建一个 table 的 2 到 10.
(defn multiples [n]
(while ( n < 11)
(println( n * n))
(swap! n inc)))
(def n (Integer/parseInt (clojure.string/trim (read-line))))
(multiples n)
有了这个,我们得到了错误:
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to clojure.lang.
(defn multiples [n]
(map #(* n %) (range 1 (+ 10 1))))
user=> (multiples 1)
;; => (1 2 3 4 5 6 7 8 9 10)
user=> (multiples 2)
;; => (2 4 6 8 10 12 14 16 18 20)
您可以遍历的结果列表和 println
每个元素。
(for [i (multiples 2)]
(println i))
;; or:
(map println (multiples 2)) ;; though one usually doesn't apply
;; `map` on side effect functions ...
改进你自己的构造:
您来自命令式语言,尝试使用突变。
这是非常不惯用的 clojure。
但是,通过声明一个值原子,您可以使用 @
运算符访问它的位置。并改变变量的值。
(defn multiples [n]
(let [i (atom 1)] ;; i is an atom
(while (< @i 11) ;; @i is the value saved into i
(println (* @i n))
(swap! i inc)))) ;; and correctly you can increase the value
有了这个倍数,还可以打印数值。
您不能将 swap!
应用于普通变量,只能应用于原子。
while
循环只有在元素数量未知时才适用。
在这种情况下,人们非常清楚何时停止。所以宁可使用
for
循环。
(defn multiples [n]
(for [i (range 1 11)]
(println (* i n))))
看看 iterate 函数做了什么 here
(defn multiples-of [n]
(iterate (partial * n) n))
(def ten-multiples-of-ten
(take 10 (multiples-of 10)))
编辑:我误读了问题的作者,我相信他只想生成一系列正方形。这是使用传感器的一种方法,为什么不呢 ;)
(def xf
(comp
(map inc)
(map #(* % %))))
(defn first-n-squares [n]
(into [] xf (take n (range))))
您可以在循环中使用 recur
:
(defn multiples [n]
(if (< n 11)
(do ; then
(println (* n n))
(recur (inc n)))
nil)) ; else return nil
运行 通过调用
(multiples 1)
在 REPL 中将产生
1
4
9
16
25
36
49
64
81
100
nil