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