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
深入理解PHP原理之异常机制
Aug 21 PHP
对淘宝URL中ID提取的PHP代码
Sep 01 PHP
php获取新浪微博数据API实例
Nov 12 PHP
微信公众平台接口开发入门示例
Dec 24 PHP
Laravel 5框架学习之Laravel入门和新建项目
Apr 07 PHP
php 计算两个时间相差的天数、小时数、分钟数、秒数详解及实例代码
Nov 09 PHP
PHP实现的方程求解示例分析
Nov 11 PHP
PHP对象、模式与实践之高级特性分析
Dec 08 PHP
thinkPHP框架实现图像裁剪、缩放、加水印的方法
Mar 14 PHP
centos下file_put_contents()无法写入文件的原因及解决方法
Apr 01 PHP
php解决约瑟夫环算法实例分析
Sep 30 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防止sql注入简单分析
2015/03/18 PHP
PHP创建word文档的方法(平台无关)
2016/03/29 PHP
Yii 框架控制器创建使用及控制器响应操作示例
2019/10/14 PHP
php实现图片压缩处理
2020/09/09 PHP
javascript call和apply方法
2008/11/24 Javascript
学习面向对象之面向对象的基本概念:对象和其他基本要素
2010/11/30 Javascript
js 利用className得到对象的实现代码
2011/11/15 Javascript
50款非常棒的 jQuery 插件分享
2012/03/29 Javascript
使用JavaScript+canvas实现图片裁剪
2015/01/30 Javascript
JavaScript学习笔记之DOM基础 2.4
2015/08/14 Javascript
AngularJS ng-template寄宿方式用法分析
2016/11/07 Javascript
利用javascript实现的三种图片放大镜效果实例(附源码)
2017/01/23 Javascript
js实现自定义路由
2017/02/04 Javascript
运用jQuery写的验证表单(实例讲解)
2017/07/06 jQuery
vue多种弹框的弹出形式的示例代码
2017/09/18 Javascript
一个简单的node.js界面实现方法
2018/06/01 Javascript
监控Nodejs的性能实例代码
2019/07/02 NodeJs
Vue.js实现大转盘抽奖总结及实现思路
2019/10/09 Javascript
微信小程序实现左侧滑动导航栏
2020/04/08 Javascript
12 种使用Vue 的最佳做法
2020/03/30 Javascript
python使用urllib模块和pyquery实现阿里巴巴排名查询
2014/01/16 Python
使用python opencv对目录下图片进行去重的方法
2019/01/12 Python
Python实现链表反转的方法分析【迭代法与递归法】
2020/02/22 Python
Python获取指定网段正在使用的IP
2020/12/14 Python
CSS3 实现发光边框特效
2020/11/11 HTML / CSS
购买200个世界上最好的内衣品牌:Bare Necessities
2017/02/11 全球购物
美国最佳选择产品网站:Best Choice Products
2019/05/27 全球购物
澳大利亚领先的内衣店:Bendon Lingerie澳大利亚
2020/05/15 全球购物
php优化查询foreach代码实例讲解
2021/03/24 PHP
财务会计专业应届毕业生求职信
2013/10/18 职场文书
业务员岗位职责
2013/11/16 职场文书
小学家长会邀请函
2014/01/23 职场文书
老干部工作汇报材料
2014/10/28 职场文书
2020年元旦晚会策划书模板
2019/12/30 职场文书
golang中的struct操作
2021/11/11 Golang
Python 绘制多因子柱状图
2022/05/11 Python