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之第二天
Oct 09 PHP
Cannot modify header information错误解决方法
Oct 08 PHP
php HandlerSocket的使用
May 02 PHP
thinkphp 多表 事务详解
Jun 17 PHP
用PHP来计算某个目录大小的方法
Apr 01 PHP
ThinkPHP实现跨模块调用操作方法概述
Jun 20 PHP
php比较相似字符串的方法
Jun 05 PHP
php获取开始与结束日期之间所有日期的方法
Nov 29 PHP
Laravel中批量赋值Mass-Assignment的真正含义详解
Sep 29 PHP
thinkPHP框架实现的无限回复评论功能示例
Jun 09 PHP
PHP lcfirst()函数定义与用法
Mar 08 PHP
php判断目录存在的简单方法
Sep 26 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提示undefined index的几种解决方法
2012/05/21 PHP
php文字水印和php图片水印实现代码(二种加水印方法)
2013/12/25 PHP
PHP的Yii框架中过滤器相关的使用总结
2016/03/29 PHP
php arsort 数组降序排序详细介绍
2016/11/17 PHP
PHPMailer发送邮件
2016/12/28 PHP
执行iframe中的javascript方法
2008/10/07 Javascript
JSChart轻量级图形报表工具(内置函数中文参考)
2010/10/11 Javascript
Json2Template.js 基于jquery的插件 绑定JavaScript对象到Html模板中
2011/10/29 Javascript
javascript 使用 NodeList需要注意的问题
2013/03/04 Javascript
Jquery通过Ajax访问XML数据的小例子
2013/11/18 Javascript
开源的javascript项目Kissy介绍
2014/11/28 Javascript
jQuery Ajax使用实例
2015/04/16 Javascript
遮罩层点击按钮弹出并且具有拖动和关闭效果(两种方法)
2015/08/20 Javascript
JavaScript中子对象访问父对象的方式详解
2016/09/01 Javascript
js实现数字递增特效【仿支付宝我的财富】
2017/05/05 Javascript
ajax +NodeJS 实现图片上传实例
2017/06/06 NodeJs
Angular.js ng-file-upload结合springMVC的使用教程
2017/07/10 Javascript
JSON创建键值对(key是中文或者数字)方式详解
2017/08/24 Javascript
Vue按需加载的具体实现
2017/12/02 Javascript
Vue封装一个简单轻量的上传文件组件的示例
2018/03/21 Javascript
详解vue+axios给开发环境和生产环境配置不同的接口地址
2019/08/16 Javascript
JavaScript canvas实现跟随鼠标移动小球
2021/02/09 Javascript
将Python代码嵌入C++程序进行编写的实例
2015/07/31 Python
[原创]python爬虫(入门教程、视频教程)
2018/01/08 Python
将python2.7添加进64位系统的注册表方式
2019/11/20 Python
Python+OpenCV实现旋转文本校正方式
2020/01/09 Python
python实现批量转换图片为黑白
2020/06/16 Python
Python socket服务常用操作代码实例
2020/06/22 Python
HTML5 画布canvas使用方法
2016/03/18 HTML / CSS
三星印度官网:Samsung印度
2019/08/03 全球购物
求职简历中个人的自我评价
2013/12/01 职场文书
2014组织生活会方案
2014/05/19 职场文书
部队2014年终工作总结
2014/11/27 职场文书
中国式结婚:司仪主持词(范文)
2019/07/25 职场文书
python爬虫请求库httpx和parsel解析库的使用测评
2021/05/10 Python
MySQL中datetime时间字段的四舍五入操作
2021/10/05 MySQL