Clojure变量赋值

时间:2015-06-12 12:27:18

标签: vector clojure variable-assignment

我是另一个Clojure-newbi!

如何将包含某些值的向量分配给另一个? 我想这样做:

  

[a b]>>> [b(+ a b)]   因此,之后b的值为(a + b),而b的值为。

1 个答案:

答案 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,当计数器变为零时返回。