需要Clojure中任意数字的前10个倍数



我们被分配了一个任务,输出我们为其编写了以下代码的任意数字的前十个倍数。它抛出一个错误。简单来说,如果n = 2,那么我们需要创建一个包含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 ...

改进你自己的结构:

你,来自命令式语言,试着处理突变。这是非常不习惯的。但是,通过声明一个值原子,您可以使用@操作符访问它的位置。并改变变量的值

(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循环1只适用于元素数量未知的情况。在这种情况下,一个人非常清楚,什么时候停止。所以使用ratherafor循环。

(defn multiples [n]
(for [i (range 1 11)]
(println (* i n))))

看看迭代函数在这里

(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

相关内容

最新更新