前言:锻炼自己的思想,规范自己的编程思路。每天一道算法题,督促自己。
靡不有初,鲜克有终,加油坚持下去。
问题:请你编写一个生成器函数,并返回一个可以生成 斐波那契数列 的生成器对象。
斐波那契数列 的递推公式为 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
*/
执行结果如下图:
结论:去网上查询了一下yield的用法,学习一下用法,yield是ES6的新关键字,使生成器函数执行暂停,yield关键字后面的表达式的值返回给生成器的调用者,可以被认为是一个基于生成器的版本的return关键字。
yield无法单独工作,需要配合generator(生成器)的其他函数,如next,懒汉式操作,展现强大的主动控制特性。想到要用yield变量,大致是因为示例里的next()函数吧。