在Clojure中理解这些Fibonacci函数

时间:2014-01-11 01:33:41

标签: clojure

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

(defn fib-step [[a b]]
  [b (+ a b)])

我很确定我已经搞清楚了。它使用宏(defn)来创建一个带有n个参数的命名函数(fib-step)。然后它将这些参数解构为两个变量a和b。它首先返回一个由b组成的向量,然后在第二个位置加上a和b。

我现在正在努力完成这个功能:

(defn fib-seq []
  (map first (iterate fib-step [0 1])))

同样,它使用宏来创建一个命名函数fib-seq。我想我理解使用[0 1]向量播种的迭代函数,但我对 map first 函数感到困惑。

我知道地图需要一个函数和一个序列,为什么他们使用“第一个”?

为什么我不能写

(take 5 (iterate fib-step [0 1]))

获取懒惰序列中的前5个数字?地图的目的是什么?首先是什么?

对不起这样一个基本问题:(

1 个答案:

答案 0 :(得分:2)

使用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