算法思考(1)别再用递归计算斐波那契数列了!

2023-05-16

曾经学习到递归时,相信绝大部分人都使用过斐波那契数列来学习递归吧。

当初我学习递归是老师还刻意让我们思考如何优化其性能,于是我们加了一些变量、参数 用于传递数据减少内存消耗,或者讲递归分割,分割成多个子递归最后挨个计算完了后进行合并。

但是!我当初学习时却被递归给局限住了,由于在学习递归,所以始终想的是如何用递归来实现,却忽略应当用最简便最高的方式来解决问题,直到今天我在一篇文章的评论区看到实用递归的斐波那契数列来测试计算性能是突然想到:斐波那契为啥要用递归,明明是个数组啊!就单数列而言数组也更家接近其结构吧...

正如《编程珠玑》第2版中提到的:结构决定算法,想这类结构已经有现成数据结构可以满足的数据显然应当优先考虑使用符合现有数据结构的计算方法才是更高效的,假如你正在学习或者你也和我一样曾经局限于算法->数据,那么不妨从此刻起尝试这换一种方式:数据决定算法的形式来进行编程。当然,更建议根据实际场景或者目标优先原则,在具体场景或目标实现了后尝试多方位尝试以寻求最优解为最终目标(前提你的老板能给你优化的时间,如果老板不给时间的话那就记录下吧?总比回头丢了忘了好吧)

以下实用数组实现的斐波那契方法:


const fibonacci = (n) => {
  if (typeof n !== 'number' || n <= 0) {
    throw new Error(`${n} must be a number greater than 0`);
  }
  if (n < 3) {
    return 1;
  } else if (n > 1476) {  // 最大值在 n 等于 1476 时,超过 1476 计算出来的值就已经超出 js 可表示的数值大小了,全部只能得到 Infinity
    return Infinity;
  }
  const resArr = new Array(n).fill(1);  // 省去初始化第一项和第二项了
  for (let i = 2; i < n; i++) {
    resArr[i] = resArr[i - 1] + resArr[i - 2];
  }
  return resArr[n - 1];
}

console.log(fibonacci(1476));  // 1.3069892237633987e+308  

console.log(fibonacci(1477));  // Infinity  

如果你需要大量使用的话,可以讲这里的 resArr 放到闭包中或者全局(不推荐),然后改进该方法使其在原本的 resArr 基础上如果 n 比之前大则 push 进去,如果比之前小则直接返回即可,但是相信大家也用不到几次吧,但是思路依然可以放到其他算法中,在使用频繁的计算耗时的算法建议使用数据缓存形式以降低平均耗时。

本人没有专门的进行算法学习,所以遇到这种思路可以记录一下,欢迎各位积极批评!

 

转载于:https://www.cnblogs.com/YMaster/p/11356860.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

算法思考(1)别再用递归计算斐波那契数列了! 的相关文章

随机推荐

  • prometheus+node_exporter+grafana详细部署流程(非docker部署)

    一 环境说明以及效果展示 1 背景 xff1a 在进行性能测试时 xff0c 想直观看到服务器的瓶颈在哪里 xff0c cpu 内存占用多少 xff0c 是否是网络因为导致性能上不去等等 xff0c 而prometheus 43 node
  • vnc连接阿里云,阿里云怎么连接vnc,推荐四款vnc连接软件

    vnc连接阿里云不知道大家熟不熟悉 xff0c 小编因为一些原因 xff0c 接触vnc连接阿里云的也比较多一点 在用了很多款的vnc软件之后 xff0c 知道了阿里云怎么连接vnc xff0c 接下来推荐四款除了阿里云的vnc连接软件 第
  • vnc远程控制软件配置,vnc远程控制软件怎么配置的,教程详解

    vnc远程控制软件配置 xff0c 小编在使用vnc服务端的时候是非常需要知道vnc远程控制软件配置的 xff0c 但当时确实是找了很久没找到 xff0c 所以现在也是有经验的人了 接下来就介绍一下vnc远程控制软件配置吧 xff0c 加教
  • vncserver安装,vncserver安装,安装教程详解

    Virtual Network Computing VNC 是进行远程桌面控制的一个软件 客户端的键盘输入和鼠标操作通过网络传输到远程服务器 xff0c 控制服务器的操作 服务器的图形界面 通过网络传输会客户端显示给用户 给你的感觉就像直接
  • ubuntu固定网络设置失败总结

    1 注意DNS xff0c sudo vim etc resolv conf xff0c 图1这里的DNS一定要设置 xff0c 不然只设置图2的DNS xff0c ping baidu com是不行的 图1 图2 经验引用https bl
  • 史上最全docker安装方法!

    2017年2月8日 xff0c docker更新到1 13 1 xff08 更新日志 xff09 xff0c 此后又分为了docker CE xff08 社区版 xff09 和docker EE xff08 商业版 xff09 此处只分享d
  • Centos8 初体验 (六)最小化安装下与centos7比较一些变化,比如同一场景使用的包不同等

    1 默认没有开启atd服务 xff0c 如果需要必须手动安装 xff1a dnf install at y systemctl enable atd systemctl start atd root 64 warclouds systemc
  • ovn:单节点搭建最简单环境演示

    创建各服务其中红色部分是必须安装的 rw r r 1 root root 1 8M 2月 28 16 08 openvswitch 2 13 0 1 x86 64 rpm rw r r 1 root root 5 2M 2月 28 16 0
  • OVN:dhcp-options分配网络的问题

    如果将逻辑逻辑网络接入路由器的网关地址分配了比如10 10 0 2 也就是这个网关地址已经配置了 xff0c 不能在继续分配给其他的虚拟机了 但是ovn在初始分配给私网下虚拟机IP地址时也会继续分配这个IP地址 xff0c 造成地址重复出现
  • 【深度解刨C语言】符号篇(全)

    文章目录 一 注释二 续行符与转义符1 续行符2 转义符 三 回车与换行四 逻辑操作符五 位操作符和移位操作符六 前置 43 43 与后置 43 43 七 字符与字符串八 和 1 四种取整方式2 取模与取余的区别和联系3 两边异号的情况1
  • 关于论文那点事——对抗样本

    学会读论文是一件读研期间必做的事 xff0c 已经读过好几篇 xff0c 但都是浅读 xff0c 读完后发现啥也没记住 xff0c 总想着等我有需要我再去细读文章 xff0c 但如果你连自己研究方法的各种理论和方法都没有基础了解的话 xff
  • 论文那些事—Learning Deep Features for Discriminative Localization

    1 摘要 背景 论文主要针对图片中不同类别物体定位的弱监督学习问题 xff0c 提出了基于分类网络的图片识别与定位 在分类模型中 xff0c 卷积层本身带有物体定位功能 xff0c 比如一个物体在左上角 xff0c 那么卷积之后的结果 fe
  • 2023年高频Java面试题集锦(含答案),让你的面试之路畅通无阻

    面试职位 xff1a Java后端开发工程师 在面试前三面真的有点急促 xff0c 一周内就面完了三次面试 xff0c 接着就开始无尽的等待 xff0c 整整等了三周左右 xff0c 终于完成了四面和HR面 整个过程还是比较曲折的 xff0
  • URL的标准格式

    URL的标准格式 scheme host port path query fragment 1 scheme xff1a 协议 2 host xff1a 主机 3 port xff1a 端口 4 path xff1a 路径 5 query
  • koa2获取用户ip

    调用下面方法即可获取 koa2 中 req 为 ctx req const getUserIp 61 req 61 gt return req headers 39 x forwarded for 39 req connection rem
  • Vim插件YouCompleteMe安装记录(号称最难装的Vim插件?)

    使用 PulginInstall 安装就不要想了 xff0c 如果你没有梯子的话 自己的 ssr 被封 xff0c 使用的同事的 ss xff0c 但是同事设置的加密方式在 linux 上的 ss 应用不支持 好吧 xff0c 直接上过程
  • 低显存(4g)训练LoRA模型的一些经验+自训练四季夏目LoRA模型分享

    一 Lora简介 LoRA Low Rank Adaptation of Large Language Models 是微软研究员引入的一项新技术 xff0c 主要用于处理大模型微调的问题 目前超过数十亿以上参数的具有强能力的大模型 例如
  • docker无法删除<none>镜像

    1 1 进入root权限 2 3 sudo su 或 sudo i 4 5 2 停止所有的container xff08 这样才能够删除其中的images xff09 xff1a 6 7 docker stop docker ps a q
  • node(koa2)跨域与获取cookie

    欲做一个node 的网关服务 xff0c 通过 cookie 做信息传递 xff0c 选择框架 koa2 xff0c 这里简单记录跨域处理以及 cookie 获取 首先 xff1a 解决跨域问题 xff0c 使用 koa2 cros 来处理
  • 算法思考(1)别再用递归计算斐波那契数列了!

    曾经学习到递归时 xff0c 相信绝大部分人都使用过斐波那契数列来学习递归吧 当初我学习递归是老师还刻意让我们思考如何优化其性能 xff0c 于是我们加了一些变量 参数 用于传递数据减少内存消耗 xff0c 或者讲递归分割 xff0c 分割