博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Thinking——斐波拉契数列不用递归
阅读量:7199 次
发布时间:2019-06-29

本文共 914 字,大约阅读时间需要 3 分钟。

斐波拉契数列

这个数列生成规则很简单,每一项都是前两项的和,举例

1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233……
用数学符号来描述更好

$$ F_{n}=F_{

{n-1}}+F_{
{n-2}}(n≧2) $$

递归方法求解

这个几行代码就可以解决

// n从1开始function fib(n) {    if (n <= 2)        return 1;    return fib(n - 1) + fib(n - 2);}

但是分析一下这个算法的执行过程,以f(6)为例

图片描述
以上的递归树中,很多节点被重复计算,譬如f(2)就被重复执行了5次,另外,递归调用中每一个函数都要保留上下文,所以空间上开销也不小。所以这个方法并不是很理想。

循环方法求解

其实还是利用斐波拉契数列的特性

// n从1开始function fibFor(n) {    if (n <= 2)        return 1;    let arr = [];    //arr[0] = 0;    arr[2] = arr[1] = 1;    for (let i = 3; i <= n; i++) {        arr[i] = arr[i - 1] + arr[i - 2];    }    return arr[n];}

当然这个方法还可以压缩一下,因为我们没必要存储一个数组,只用三个变量就行了。

// n从1开始function fibFor2(n) {    if (n <= 2)        return 1;    let before2 = 1;    let before1 = 1;    let now = null;    for (let i = 3; i <= n; i++) {        now = before1 + before2;        before2 = before1;        before1 = now;    }    return now;}

这其实就是动态规划的思想了,自底向上,用子问题解决父问题。

转载地址:http://jhzum.baihongyu.com/

你可能感兴趣的文章
Brocade 300 FC交换机收集诊断日志
查看>>
解决(inode)索引节点用满导致故障的方法
查看>>
ORACLE 10g下载|ORACLE 10g下载地址|ORACLE 10g官网下载地址
查看>>
Create an Auto-Incrementing Sequence Field
查看>>
我的友情链接
查看>>
Flutter第六期 - ListView+GridView混合
查看>>
Servlet快速入门
查看>>
mysql性能测试工具之sysbench
查看>>
python获取类名函数名、脚本路径
查看>>
Hadoop hive sqoop zookeeper hbase生产环境日志统计应用案例(故障篇)
查看>>
sudo日志文件跟踪
查看>>
游戏开发路线图
查看>>
内存分配方式及常见错误
查看>>
phpcms去掉前台和后台登录验证码
查看>>
批处理:查找指定条件的文件复制到指定的目录中
查看>>
导致失败的8项行为习惯
查看>>
我的友情链接
查看>>
PVS7.6 Write Cache模式 “缓存到RAM并且溢出到硬盘” 环境RAM大小配置建议
查看>>
java 双色球×××小程序
查看>>
Exchange性能调优(下)
查看>>