生成斐波那契数列

119 阅读2分钟

前言:锻炼自己的思想,规范自己的编程思路。每天一道算法题,督促自己。

靡不有初,鲜克有终,加油坚持下去。

问题:请你编写一个生成器函数,并返回一个可以生成 斐波那契数列 的生成器对象。

斐波那契数列 的递推公式为 Xn = Xn-1 + Xn-2 。

这个数列的前几个数字是 0, 1, 1, 2, 3, 5, 8, 13 。

示例:

输入:callCount = 5
输出:[0,1,1,2,3]
解释:
const gen = fibGenerator();
gen.next().value; // 0
gen.next().value; // 1
gen.next().value; // 1
gen.next().value; // 2
gen.next().value; // 3

思路:斐波那契函数写过很多遍了,C语言,python语言都写过,所以逻辑很清楚,就是循环迭代就可以得到结果,但是JavaScript语言确实还没有写过,但是我觉得应该js写应该更简单吧,毕竟里面有很多内置函数。

所以一开始我就先声明三个迭代变量,a=0,b=1,c=a+b,但是我很快发现,这个题是要我输出得到的所有斐波那契数组,也难不倒我,声明一个新数组接收到值即可。所以我得到了如下代码:

var fibGenerator = function*() {
    let a=0,b=1,c=a+b
    let array = [0,1,1]
    let count = callCount 
    if(count === 0) return 
    while(count){
        // yield a
        a=b
        b=c
        c=a+b
        array.push(c)
    }
    return array
};

可是第4行代码一直在报错,我不理解,明明输入的是数字,为什么不能赋值,所以我就去浏览了一下评论区,发现大家使用了yield的一个类型,然后就可以实现了,斐波那契的大致思路还是不变的,代码如下:

/**
 * @return {Generator<number>}
 */
var fibGenerator = function*() {
    let a=0,b=1,c=a+b
    while(1){
        yield a
        a=b
        b=c
        c=a+b
    }
};

/**
 * const gen = fibGenerator();
 * gen.next().value; // 0
 * gen.next().value; // 1
 */

执行结果如下图:

image-20230501134934891.png

结论:去网上查询了一下yield的用法,学习一下用法,yield是ES6的新关键字,使生成器函数执行暂停,yield关键字后面的表达式的值返回给生成器的调用者,可以被认为是一个基于生成器的版本的return关键字。

yield无法单独工作,需要配合generator(生成器)的其他函数,如next,懒汉式操作,展现强大的主动控制特性。想到要用yield变量,大致是因为示例里的next()函数吧。