这一小节,我们将讨论如何使用Generator函数生成斐波那契数列。注意,本节所使用的代码只是用于演示目的,在实际环境中,出于性能的考虑,你最好预先生成该数列。
斐波那契数列第一项和第二项为0和1,后续每一项的值为前两项之和:
0, 1, 1, 2, 3, 5, 8, 13, 21, ...
使用递推形式,它也可以表示为:fib(n) = fib(n - 1) + fib(n - 2)
我们可以基于上面的定义写一个Generator函数,以生成斐波那契数列的值:
code/generators/fibo.js
function* fibo(n, prev = 0, current = 1) {
if (n === 0) {
return prev
}
yield prev
yield* fibo(n - 1, current, prev + current)
}
let vals = [...fibo(5)]
console.log(vals) //-> [ 0, 1, 1, 2, 3 ]
上面的代码中,我们使用默认参数prev = 0, current = 1
定义了数列前两项的值,以下是上述代码的大致执行过程:
- 第一次调用为
fibo(5, 0, 1)
,此时生成的值为0 - 第二次调用为
fibo(4, 1, 1)
,此时生成的值为1 - 第三次调用为
fibo(3, 1, 2)
,此时生成的值为1 - 第四次调用为
fibo(2, 2, 3)
,此时生成的值为2 - 第五次调用为
fibo(1, 3, 5)
,此时生成的值为3 - 第六次调用为
fibo(0, 5, 8)
,由于n
为0,return
语句执行后,Generator函数终断,并没有生成新的值;所以,最后打印结果为[0, 1, 1, 2, 3]