在Clojure中理解这些斐波那契函数

在Clojure中理解这些斐波那契函数,clojure,Clojure,我试图理解的代码由两个函数组成: (defn fib-step [[a b]] [b (+ a b)]) 我很确定我已经弄明白了。它使用宏(defn)创建一个命名函数(fib-step),该函数接受n个参数。然后它将这些参数分解为两个变量a和b。它返回一个向量,第一位是b,第二位是a和b的相加 我现在正在尝试使用此函数: (defn fib-seq [] (map first (iterate fib-step [0 1]))) 同样,它使用宏创建命名函数fib seq。我想我理解迭

我试图理解的代码由两个函数组成:

(defn fib-step [[a b]]
  [b (+ a b)])
我很确定我已经弄明白了。它使用宏(defn)创建一个命名函数(fib-step),该函数接受n个参数。然后它将这些参数分解为两个变量a和b。它返回一个向量,第一位是b,第二位是a和b的相加

我现在正在尝试使用此函数:

(defn fib-seq []
  (map first (iterate fib-step [0 1])))
同样,它使用宏创建命名函数fib seq。我想我理解迭代函数是以[01]向量作为种子的,但是我对映射第一个函数感到困惑

我知道map需要一个函数和一个序列,所以为什么他们使用“first”

为什么我不能写呢

(take 5 (iterate fib-step [0 1]))
要获取惰性序列中的前5个数字?这张地图的目的是什么

很抱歉提出这样一个基本问题:(

使用REPL:

(take 5 (iterate fib-step [0 1]))
;=> ([0 1] [1 1] [1 2] [2 3] [3 5])
这就是你想要的吗?不,输入
[f\n f{n+1}]
后,
fib-step
的输出是
[f{n+1}f{n+2}]
f{n+1}
项已重复。此外,输出是成对的

你真正想要的是每对中的第一对

如何获得第一个?
first


你是如何在成对的序列上做到这一点的?
map

啊,我想它对我来说只是点击了一下。迭代必须获得自身的输出,才能知道如何正确地增加自身?因为我们需要处理序列中的前一个数字,我们总是需要传递成对。迭代只是一个循环构造,返回r作为惰性序列的一部分的每一步的结果。这只是经典模式的一种变体,通常包括尾部递归,以实现纯粹功能性的循环。这种变体的目标是让循环在每一步中产生部分结果,从而在理论上允许无限循环,并且只能进行必要的计算随需应变。