生成无限循环序列

这一小节,我们将讨论如何使用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定义了数列前两项的值,以下是上述代码的大致执行过程:

  1. 第一次调用为fibo(5, 0, 1),此时生成的值为0
  2. 第二次调用为fibo(4, 1, 1),此时生成的值为1
  3. 第三次调用为fibo(3, 1, 2),此时生成的值为1
  4. 第四次调用为fibo(2, 2, 3),此时生成的值为2
  5. 第五次调用为fibo(1, 3, 5),此时生成的值为3
  6. 第六次调用为fibo(0, 5, 8),由于n为0,return语句执行后,Generator函数终断,并没有生成新的值;所以,最后打印结果为[0, 1, 1, 2, 3]
用户头像
登录后发表评论