需要 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