php求斐波那契数的两种实现方式【递归与递推】


Posted in PHP onSeptember 09, 2019

本文实例讲述了php求斐波那契数的两种实现方式。分享给大家供大家参考,具体如下:

斐波那契数,亦称之为斐波那契数列(意大利语: Successione di Fibonacci),又称黄金分割数列、费波那西数列、费波拿契数、费氏数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……在数学上,斐波那契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=Fn-1+Fn-2(n>=2,n∈N*),用文字来说,就是斐波那契数列列由 0 和 1 开始,之后的斐波那契数列系数就由之前的两数相加。

1 使用递归方法。  顺着思路去想, f(1)= 1; f(2) = 1 ; f(3) = f(2)+f(1)  【2】  f(4) = f(3)+f(2) 3

//使用递归方式求斐波那契数
public function fb($n){ //
    if( $n <=2){
      return 1;
    }else{
      return fb($n-1) + fb($n-2);
    }
}

2使用递推方法。

public function fb2($n){ //
    if( $n <=2){
      return 1;
    }
    $t1 = 1;$t2 = 1;
    for($i=3;$i<$n;$i++){
      $temp = $t1;
      $t1 = $t2;
      $t2 = $temp + $t2;
    }
    return $t1 + $t2;
}

最后,进行性能分析。

明显的可以预测,递归方法,每多一层,就要向下递归两次。 约为 O(2 的N次方)  而递推算法为  O(n),实测代码如下。

/**性能测试。*/
function bench_profile($starttime , $flag = ''){
  $endtime = explode(' ',microtime());
  $thistime = $endtime[0]+$endtime[1]-($starttime[0]+$starttime[1]);
  $thistime = round($thistime,3);
  return $flag."-bench:".$thistime." sec";
}
//使用递归算法。
ini_set("max_execution_time" ,3600);
$s = explode(' ',microtime());
echo  bench_profile($s )."<br/>";
  echo fb(35); //使用递归 耗时 40.925 sec  每往上一个数约慢两倍
echo bench_profile($s )."<br/>";
//使用递推算法。
$s = explode(' ',microtime());
echo  bench_profile($s )."<br/>";
  echo fb2(35); //使用递推 时间极短。
echo bench_profile($s )."<br/>";

总结:使用递归算法,到求第100 个斐波那契数 时会卡到机器跑不动,而使用递推算法,几乎不费时间。

算法复杂度是非常重要的概念,也是区分程序员的一把好尺子。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php中static静态变量的使用方法详解
Jun 04 PHP
PHP之生成GIF动画的实现方法
Jun 07 PHP
PHP的基本常识小结
Jul 05 PHP
php遍历文件夹所有文件子文件夹函数代码
Nov 27 PHP
php解决约瑟夫环示例
Apr 09 PHP
php文件上传的两种实现方法
Apr 04 PHP
php使用pear_smtp发送邮件
Apr 15 PHP
使用Yii2实现主从数据库设置
Nov 20 PHP
Laravel多用户认证系统示例详解
Mar 13 PHP
php如何获取Http请求
Apr 30 PHP
PHP使用Http Post请求发送Json对象数据代码解析
Jul 16 PHP
基于PHP的登录和注册的功能的实现
Aug 06 PHP
PHP使用 Imagick 扩展实现图片合成,圆角处理功能示例
Sep 09 #PHP
Yii框架常见缓存应用实例小结
Sep 09 #PHP
Yii框架函数简单用法分析
Sep 09 #PHP
Yii框架的路由配置方法分析
Sep 09 #PHP
PHP实现时间日期友好显示实现代码
Sep 08 #PHP
PHP中将一个字符串部分字符用星号*替代隐藏的实现代码
Sep 08 #PHP
Yii框架连表查询操作示例
Sep 06 #PHP
You might like
PHP 巧用数组降低程序的时间复杂度
2010/01/01 PHP
php代码中使用换行及(\n或\r\n和br)的应用
2013/02/02 PHP
thinkphp区间查询、统计查询与SQL直接查询实例分析
2014/11/24 PHP
html5的自定义data-*属性和jquery的data()方法的使用示例
2013/08/21 Javascript
js实现完美兼容各大浏览器的人民币大小写相互转换
2015/10/29 Javascript
Angularjs在初始化未完毕时出现闪烁问题的解决方法分析
2016/08/05 Javascript
Angularjs通过指令监听ng-repeat渲染完成后执行脚本的方法
2016/12/31 Javascript
浅谈js停止事件冒泡 阻止浏览器的默认行为(阻止超连接 #)
2017/02/08 Javascript
js中document.referrer实现移动端返回上一页
2017/02/22 Javascript
ES6学习教程之模板字符串详解
2017/10/09 Javascript
解决使用vue.js路由后失效的问题
2018/03/17 Javascript
微信小程序日期选择器实例代码
2018/07/18 Javascript
基于vue2.0实现仿百度前端分页效果附实现代码
2018/10/30 Javascript
Vue项目中使用jquery的简单方法
2019/05/16 jQuery
基于ssm框架实现layui分页效果
2019/07/27 Javascript
通过js示例讲解时间复杂度与空间复杂度
2019/08/06 Javascript
layui固定下拉框的显示条数(有滚动条)的方法
2019/09/10 Javascript
原生js实现点击按钮复制内容到剪切板
2020/11/19 Javascript
[02:36]DOTA2英雄基础教程 斯拉克
2013/11/29 DOTA
Python操作sqlite3快速、安全插入数据(防注入)的实例
2014/04/26 Python
python实现简单socket程序在两台电脑之间传输消息的方法
2015/03/13 Python
举例讲解Python中装饰器的用法
2015/04/27 Python
Python工程师面试题 与Python基础语法相关
2016/01/14 Python
深入浅出学习python装饰器
2017/09/29 Python
pytorch permute维度转换方法
2018/12/14 Python
对python捕获ctrl+c手工中断程序的两种方法详解
2018/12/26 Python
解决Python 命令行执行脚本时,提示导入的包找不到的问题
2019/01/19 Python
Python Matplotlib实现三维数据的散点图绘制
2019/03/19 Python
澳大利亚小众服装品牌:Maurie & Eve
2018/03/27 全球购物
中职生自我鉴定范文
2013/10/03 职场文书
学生个人自我鉴定范文
2014/03/28 职场文书
校本教研活动总结
2014/07/01 职场文书
党员学习党的群众路线思想汇报(5篇)
2014/09/10 职场文书
法人授权委托书
2014/09/16 职场文书
2016年猴年新春致辞
2015/08/01 职场文书
2016年学校“6﹒26国际禁毒日”宣传活动总结
2016/04/05 职场文书