某一天,旁边的同事问我,知道斐波什么数吗。我说,不知道。同事又说,这不是面试必问的吗。我尴尬又不失优雅的一笑🤓🤓🤓。
什么是斐波那契数列
首先它是一个数列,在数学上是以递归的方法定义
简单来说,就是第一个和第二个数字是 0 和 1,后面的数字都是前两个数字的和。
现在我们的问题是求第二十个斐波那契数或者求最接近某个数的斐波那契数。
es5 实现
其实只需要构造一个递归的函数即可
1 | // 第一种 |
第一种粗暴解决,但是速度令人堪忧。第二种利用缓存,极大优化处理时间。这种方法每次只能返回一个数据,都无法优雅地解决我们的问题。
es6 实现
1 | function* fib_generator() { |
es6实现中主要使用了generator function
、yield
、数组结构
等特性。
> generator function
是就是ES6中的生成器函数,写起来很简单,只要在function
后面加上一个*
号即可:
1 | function* foo1() { }; |
调用生成器函数会产生一个生成器(generator)。生成器拥有的最重要的方法是 next(),用来迭代:
1 | function* foo() { }; |
next 方法返回一个拥有 value 和 done 两个字段的对象。
生成器函数通常和 yield 关键字同时使用。函数执行到每个 yield 时都会中断并返回 yield 的值(通过 next 方法返回对象中的 value 字段)。下次调用 next,函数会从 yield 的下一个语句继续执行。等到整个函数执行完,next 方法返回的 done 字段会变成 true。
所以通过fib.next().value
就会循环得到前 20 个斐波那契数。
如果一直调用 next()方法也太费劲了,这就要说明生成器函数也是可遍历的,它是一个可迭代对象,一个定义了迭代行为的对象,比如在 for…of 中循环了哪些值。一些内置类型,如 Array 或 Map 具有默认的迭代行为,而其他类型(如 Object)没有。所以只要使用 for 循环就可以了,遍历得到的值就是yield
返回的值,用生成器函数来产生斐波那契数列既高效又直观。
除此之外,生成器还有一个 return 方法:
1 | function* gen() { |
可以得知 return 方法会返回指定的值并结束生成器。而当生成器函数已经结束的时候,再去调用 return 方法,则也会返回给定值,并且结束生成器。
1 | function* gen() {yield 1;} |
- 本文链接: https:https://whyour.cn/post/es6-fibolachian-sequence.html
- 最后更新于:
- 版权声明: 本博客所有文章除特别声明外,均采用 署名 4.0 国际(CC BY 4.0) 许可协议。转载请注明出处!