我们被分配了一个任务,输出我们为其编写了以下代码的任意数字的前十个倍数。它抛出一个错误。简单来说,如果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