我试图理解的代码由两个函数组成:
(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个数字?地图的目的是什么?首先是什么?
对不起这样一个基本问题:(
答案 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