博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用递归解决斐波那契数列的性能问题
阅读量:7217 次
发布时间:2019-06-29

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

我们知道斐波那契数列(也称作兔子数列)  1,1,2,3,5,8,13,21,34。。。。。

前两位数固定是1,之后每一位数都是前两位数的之和,这样的数列就是斐波那契数列

那么我们要求这样的数列,就必须要求n-1和n-2位数

 

function getFB(n){      if(n == 1 || n == 2){       // 这里我们先保持前两位数是1        return 1;      }else {        return getFB(n-1) + getFB(n-2);      }    }    console.log(getFB(10));

求斐波那契数列的第十位   在控制台中打印出来的是 55

 

那么  第五十位呢?。。。。。。。。。

很好,我的浏览器卡死崩溃了

由此我们可知,这样求斐波那契数列实在是太浪费性能了

既然有问题我们就来解决它

那么   求斐波那契数列的时候是为什么会浪费性能呢?

 

原因就是浏览器求了太多重复项

var i = 0; //声明一个变量,用来记录调用getFB()方法的次数    function getFB(n){      i++;      if(n == 1 || n == 2){        return 1;      }else {        return getFB(n-1) + getFB(n-2);      }    }    console.log(getFB(20));// 我的浏览器求不出来这么多项 所以换了小一点的数字
console.log(i);

求斐波那契数列的第20位会调用13529次函数

 

 

那么求第30位呢?

多达16万次

 第40位呢?第50 位呢?。。。。。。。

 所以这个样子实在是太浪费性能了

 

解决问题的思路:我们把已经求过的项用一个变量保存起来,如果下次还需要用到这个项就直接取出来用,而不是再去调用函数

 

var i = 0;//声明一个变量i,记录调用getFB这个函数的次数.    //声明一个对象obj,用来保存已经求过的项.    var obj = {};    function getFB(n){      i++;      //求n位是多少,就先去obj里面看看,之前求过没有,如果之前求过,就直接取出来使用.      if(obj[n] != undefined){        //如果进到了这里,说明当前这个n位已经求过,已经存进obj里面了        return obj[n];      }else {        //如果进到这里来了,就说明当前这个n位之前没求过,没求过就求呗.        if(n == 1 || n == 2){          obj[n] = 1;          return 1;        }else {          obj[n] = getFB(n-1) + getFB(n-2);          return obj[n];        }      }    }    console.log(getFB(60));    console.log(i);

那么我们就来看看结果吧

斐波那契数列的第60位大的吓人,但是我们却也只调用了117次函数,极大的提高了性能

 

转载于:https://www.cnblogs.com/mlw1814011067/p/9439651.html

你可能感兴趣的文章
349. Intersection of Two Arrays - Easy
查看>>
[算法练习]最长公共子串(LCS)
查看>>
p转c++
查看>>
树(tree)
查看>>
codevs——2645 Spore
查看>>
ssh服务之 远程登录和端口转发
查看>>
java环境配置正确,但是tomcat不能启动的解决办法
查看>>
我就是想找个人聊聊天,说说我这近四年来的经历
查看>>
不同的测试方法使用的场景
查看>>
Hadoop快速入门
查看>>
Problem S
查看>>
SVN上传的时候没法显示文件名,只显示后缀名
查看>>
Python:pygame游戏编程之旅四(游戏界面文字处理)
查看>>
fedroa 编译安装mysql5.5
查看>>
WC2018游记
查看>>
毕设开发日志2017-10-23
查看>>
***微信公众平台开发: 获取用户基本信息+OAuth2.0网页授权
查看>>
第二章 例题2-2 在屏幕上显示两个短句
查看>>
【转】iOS学习之适配iOS10
查看>>
OC语言BLOCK和协议
查看>>