我是另一个Clojure-newbi!
如何将包含某些值的向量分配给另一个? 我想这样做:
[a b]>>> [b(+ a b)] 因此,之后b的值为(a + b),而b的值为。
答案 0 :(得分:2)
看起来你正在尝试做一个斐波那契序列。
user=> (def fibseq (map first (iterate (fn [[a b]] [b (+ a b)]) [1 1])))
#'user/fibseq
user=> (take 10 fibseq)
(1 1 2 3 5 8 13 21 34 55)
你在clojure中必须记住的是不变性,所以你不能改变a和b来成为新的价值观。如下所示:
user=> (defn next-fib [[a b]]
(let [na b
nb (+ a b)]
[na nb]))
user=> (next-fib [1 2])
[2 3]
将生成一个函数next-fib,它将从您的输入中返回接下来的2个值。在函数期间,a和b不能更改,它们是不可变的,因此赋值给新值。
在这里,我使用解构来立即将输入向量的元素分解为值a和b,然后用于计算下一个元素,并且与顶部的1个衬里的方式相同我的回答有效。
或者如果你正在进行循环,你可以重复使用在前一次迭代中取代的值,这不会改变a和b(在任何迭代期间它们的值都是固定的并且仍然是不可变的),但重做整个在他们的位置堆叠新值,微妙的差异。请参阅有关尾递归的文章。
user=> (loop [a 1 b 1]
(if (< a 20)
(recur b (+ a b))
[a b]))
[21 34]
这是使用recur的Fibonacci序列的简单版本,它返回第一个n
数字。
(defn fib-recur [n]
(loop [fib [] x n a 0 b 1]
(if (zero? x)
fib
(recur (conj fib b) (dec x) b (+ a b)))))
它的工作原理是从它构建的空数组开始,然后通过将计数器(x)从n递减到0来重现,每次迭代将a和b更改为新值作为递归的一部分,并且它将最新的数字添加到数组fib
,当计数器变为零时返回。