JS怎么输出斐波那契数列
本篇内容介绍了"JS怎么输出斐波那契数列"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
试输出斐波那契数列的前10项,即 1、1、2、3、5、8、13、21、34、55。
分析
有些人看到题目中出现了"斐波那契数列"这个概念后,可能脑袋就蒙圈了,其实大可不必!
对于这道题,可以不用理会这个陌生概念,我们只需要关心后面它给出的数字规律即可。
我们可以看到,规律总结起来就一句话:从第三位开始,后面每项的值等于前两项之和,用式子表示的话就是:an = an-1 + an-2(n ≥ 2) 。
根据题目要求,其实就是要我们做两件事:
生成每一项的值。
打印输出所有值。
基础解法
解题思路:
创建一个数组存放数列各项的值。
for 循环生成数列各项并存入数组(为了计算后面各项的值),打印生成的项。
代码实现如下:
/*** @description 创建一个生成数列数组的方法* @param {number} n 表示要生成多少项(即数组长度,不是数组下标)*/function createFibArr(n) {// 声明一个存放数据的数组let fibArr = [];// 从第三项(下标为2)开始,每一项都等于前两项之和for (let index = 0; index < n; index++) {index < 2 ? fibArr.push(1) : fibArr.push(fibArr[index - 1] + fibArr[index - 2]);console.log(fibArr[index]);}} // 调用方法createFibArr(10);
分析:
这应该是最基本的解题方法,很容易就实现了。
但如果这是面试题的话,这样的答案只能说是中规中矩,没有出彩的地方,最重要的是体现不出我们与众不同的气质啊,所以,我们应该用点其他的手段来提升下自己的逼格!
初级递归
解题思路:
通过递归的手段计算出各位置对应的值(这里有个前提是:第一项和第二项是确定值,否则,递归就不好用了)。
打印结果。
代码实现如下:
/*** @description 计算出第 n 项的值* @param {number} n 表示每一项的下标值* @returns {number} 下标为 n 的位置的值*/function calFibValue(n) {console.count("执行次数:")return n < 2 ? 1 : (calFibValue(n - 1) + calFibValue(n - 2));} /*** @description 打印计算结果* @param {number} n 代表要打印多少项*/function printRes(n) {for (let index = 0; index < n; index++) {console.log(calFibValue(index));}} // 调用打印方法printRes(10); // 执行次数:: 276
分析:
递归的使用确实提升了代码的逼格,但是又引来了另外一个问题:性能问题。
每一项的值都是从第一项开始计算累加 出来的,比如计算第四项的值,其过程如下:
返回第一项的值:1 。
返回第二项的值: 1 。
计算第三项的值为 1 + 1 = 2 。
计算第四项的值为 2 + 1 = 3 。
在计算第五项值的时候,还要经过上面这个过程来获取第四项的值,进行了大量的重复运算。
为了惊艳面试官,我们还需要再做优化!
递归优化
解题思路:
导致重复计算的是递归那部分的逻辑,所以优化点在递归这里。
既然存在重复运算,那就意味着其实后面的运算完全可以使用前面已经计算出来的值,所以我们需要引入缓存来保存每次的计算结果。
代码实现:
/*** @description 计算出第 n 项的值* @param {number} n 表示每一项的下标值* @returns {number} 下标为 n 的位置的值*/ // 存放每次计算结果的 Map 结构// 这里也可以用数组,但是在语义方面没有 Map 或对象直接let fibValueMap = new Map();function calFibValue(n) {console.count("执行次数:");// 如果缓存中已存在对应的值,则直接返回if (fibValueMap.has(n)) {return fibValueMap.get(n);}const value = n < 2 ? 1 : (calFibValue(n - 1) + calFibValue(n - 2));// 在计算出每一项的之后,需要及时存入 MapfibValueMap.set(n, value);return value;} /*** @description 打印计算结果* @param {number} n 代表要打印多少项*/function printRes(n) {for (let index = 0; index < n; index++) {console.log(calFibValue(index));}} // 调用打印方法printRes(10); // 执行次数:: 26
分析:
根据打印出来的 count 来看,优化后的递归次数是优化前的 1/10 左右,这个结果就很惊喜了。
"JS怎么输出斐波那契数列"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!