Vector Clojure变量赋值

Vector Clojure变量赋值,vector,clojure,variable-assignment,Vector,Clojure,Variable Assignment,我是另一个Clojure newbi 如何将包含某些值的向量分配给另一个向量? 我想做: [ab]>>>>[b(+ab)] 之后b的值为(a+b),a的值为b 看起来你想做一个斐波那契序列 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中需要

我是另一个Clojure newbi

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

[ab]>>>>[b(+ab)] 之后b的值为(a+b),a的值为b


看起来你想做一个斐波那契序列

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]
将在fib下生成一个函数,该函数将从您的输入返回下两个值。在函数执行期间,a和b不能更改,它们是不可变的,因此分配给新值

在这里,我使用解构将输入向量的元素立即分解为值a和b,然后用于计算下一个元素,这与我答案顶部的1行的工作原理相同

或者,如果您正在执行循环,您可以使用在其上一次迭代中得到替换的值来重复,这不是更改a和b(在任何迭代中,它们的值是固定的,并且仍然是不可变的),而是使用新值替换整个堆栈,这是一个细微的差别。请参阅关于尾部递归的文章

user=> (loop [a 1 b 1]
         (if (< a 20)
           (recur b (+ a b))
           [a b]))
[21 34]

它的工作原理是从构建的空数字数组开始,然后通过将计数器(x)从n递减到0来递归,每次迭代都会将a和b更改为新值,作为递归的一部分,它将最新的数字添加到数组
fib
中,当计数器变为零时返回该值。

我实际上是在尝试使用循环/重复执行fibunci,并且想知道是否有某种方法可以做到这一点。顺便说一句,我现在不明白什么是复发。我已经测试了以下内容:
(循环[A0B0](printlnAB)(如果(
,结果是:
01012123end。。。3 3
我没有增加
a
,但重复出现似乎将inc应用于
a和b
。这是如何发生的??我已经添加了一个递归版本的斐波那契,并对我的回答进行了一些解释每次迭代重新开始时,将(递归…)中的值输入到a和b中,因此从0,0开始。在下一次迭代中,通过调用返回顶部(重复1 0)。所以a的新值是1,b是0。下一次你得到1,1作为a,b。有趣的事情也是如此!这是否意味着如果您在
recur
中更改
a
b
的顺序,并将新值完全按照它们在
loop[ab]
中出现的顺序分配给它们,clojure就不会识别
a
b
?无论您在
recur
调用中输入什么,都会被放入a和b。第一次循环发生时,您正在初始化这些值,recur会将其发送回包含新值的循环。在我的最后一个示例中,查看变量
fib
x
a
b
是如何用
[]
n
0
1
初始化的,并且当再次发生时,这些相同变量的新值是
(连体fib)
(dec x)
b
。因此,实际上a=b,b=(a+b),我们递减循环计数器,并将当前的斐波那契值存储在数组中
(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)))))