用JS怎样实现输出斐波那契数列,解法是什么
Admin 2022-07-11 群英技术资讯 1084 次浏览
这篇文章给大家分享的是用JS怎样实现输出斐波那契数列,解法是什么。小编觉得挺实用的,因此分享给大家做个参考,文中的介绍得很详细,而要易于理解和学习,有需要的朋友可以参考,接下来就跟随小编一起了解看看吧。有这么一道题目需要我们来解答:
有些人看到题目中出现了“斐波那契数列”这个概念后,可能脑袋就蒙圈了,其实大可不必!
对于这道题,可以不用理会这个陌生概念,我们只需要关心后面它给出的数字规律即可。
我们可以看到,规律总结起来就一句话:从第三位开始,后面每项的值等于前两项之和,用式子表示的话就是:an = an-1 + an-2(n ≥ 2) 。
根据题目要求,其实就是要我们做两件事:
解题思路:
代码实现如下:
/**
* @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
分析:
递归的使用确实提升了代码的逼格,但是又引来了另外一个问题:性能问题。
每一项的值都是从第一项开始计算累加 出来的,比如计算第四项的值,其过程如下:
在计算第五项值的时候,还要经过上面这个过程来获取第四项的值,进行了大量的重复运算。
为了惊艳面试官,我们还需要再做优化!
解题思路:
代码实现:
/**
* @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));
// 在计算出每一项的之后,需要及时存入 Map
fibValueMap.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 左右,这个结果就很惊喜了。
这次面试官应该可以满意了吧。
万变不离其宗,只要将解题思路理清了,代码实现只是一个结果而已。在平常的工作学习中,我们要有意识地培养自己的发散性思维,从多角度去看待问题,你可能会发现不一样的风景哦!希望能够对大家有所启发哦!
在面试中,为了突显自己的独特气质或者人家面试题目就有具体要求的,我们使用一些看起来高大上的思路,这无可厚非。
但是呢,在平常的工作中,我还是更建议大家:在性能相近的情况下,能使用基础方法解决的一般不要用“高档”方法,因为基础方法出错的概率小很多。就比如今天这道题,其实基础解法的性能是最好的。
少写 BUG,我们才能有更多的时间来摸鱼,不是吗?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
目录前言FabricObject 基类的实现抽离共同属性抽离共同方法Rect 类的实现本章小结前言在上个章节中我们已经创建了画布,接下来就可以进行物体的绘制了,那具体要怎么画呢?根据文章标题可以猜到应该是要抽象出一个物体基类,归纳出一些它们的共性,那它们能有啥共性呢,毕竟每个物体好像都是各画各的。对于这个问题大家可以先
这篇文章主要介绍如何用JS写一个发布订阅模式,什么是发布订阅模式?能手写实现一下吗?它和观察者模式有区别吗?带着疑惑一起解开下面文章的内容吧
多年以来,Node.js都不是实现高 CPU 密集型应用的最佳选择,这主要就是因为JavaScript的单线程。作为对此问题的解决方案,Node.jsv10.5.0 通过worker_threads模块引入了实验性的 “worker 线程” 概念,并从 Node.js v12 LTS 起成为一个稳定功能。
本篇文章带大家了解一下Angular 中结构指令模式,介绍一下结构指令是什么且怎么使用,希望对大家有所帮助!
这篇文章主要介绍策略模式的内容,JavaScript设计模式有很多种类型,策略模式就是其中的一种设计模式,下面有详细的介绍和实例,对新手学习和理解JavaScript设计模式有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章能有所收获。
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008