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 相关文章推荐
BBS(php &amp; mysql)完整版(五)
Oct 09 PHP
PHP 地址栏信息的获取代码
Jan 07 PHP
下拉列表多级联动dropDownList示例代码
Jun 27 PHP
php处理restful请求的路由类分享
Feb 27 PHP
PHP实现单例模式最安全的做法
Jun 13 PHP
PHP采集类Snoopy抓取图片实例
Jun 19 PHP
PHP中的gzcompress、gzdeflate、gzencode函数详解
Jul 29 PHP
详解PHP中instanceof关键字及instanceof关键字有什么作用
Nov 05 PHP
PHP获取表单数据与HTML嵌入PHP脚本的实现
Feb 09 PHP
PHP 中常量的知识整理
Apr 14 PHP
ThinkPHP框架实现导出excel数据的方法示例【基于PHPExcel】
May 12 PHP
PHP高并发和大流量解决方案整理
Dec 24 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传值到不同页面的三种常见方式及php和html之间传值问题
2015/11/19 PHP
PHP cookie与session会话基本用法实例分析
2019/11/18 PHP
用js生产批量批处理执行命令
2008/07/28 Javascript
jQuery在IE下使用未闭合的xml代码创建元素时的Bug介绍
2012/01/10 Javascript
JavaScript中valueOf函数与toString方法深入理解
2012/12/02 Javascript
js下将阿拉伯数字每三位一逗号分隔(如:15000000转化为15,000,000)
2014/06/02 Javascript
js实现点击后将文字或图片复制到剪贴板的方法
2014/08/04 Javascript
jQuery实现跨域iframe接口方法调用
2015/03/14 Javascript
详细介绍jQuery.outerWidth() 函数具体用法
2015/07/20 Javascript
JS+CSS实现精美的二级导航效果代码
2015/09/17 Javascript
jQuery中Ajax全局事件引用方式及各个事件(全局/局部)执行顺序
2016/06/02 Javascript
Java框架SSH结合Easyui控件实现省市县三级联动示例解析
2016/06/12 Javascript
Jquery调用iframe父页面中的元素及方法
2016/08/23 Javascript
jquery 属性选择器(匹配具有指定属性的元素)
2016/09/06 Javascript
KnockoutJS 3.X API 第四章之表单value绑定
2016/10/10 Javascript
jQuery中的select操作详解
2016/11/29 Javascript
JS实现页面进入和返回定位到具体位置
2016/12/08 Javascript
详解NODEJS基于FFMPEG视频推流测试
2017/11/17 NodeJs
Angular实现可删除并计算总金额的购物车功能示例
2017/12/26 Javascript
Vue中使用vux配置代码详解
2018/09/16 Javascript
关于layui 下拉列表的change事件详解
2019/09/20 Javascript
vue-property-decorator用法详解
2019/12/12 Javascript
JavaScript实现音乐导航效果
2020/11/19 Javascript
使用Typescript开发微信小程序的步骤详解
2021/01/12 Javascript
[01:05:07]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第一场2月1日
2021/03/11 DOTA
浅谈python 调用open()打开文件时路径出错的原因
2020/06/05 Python
For Art’s Sake官网:手工制作的奢华眼镜
2018/12/15 全球购物
会计专业大学生求职信范文
2014/01/28 职场文书
《恐龙》教学反思
2014/04/27 职场文书
关于清明节的演讲稿
2014/09/13 职场文书
安全先进个人材料
2014/12/29 职场文书
就业推荐表自我评价范文
2015/03/02 职场文书
2015年幼儿教师个人工作总结
2015/05/20 职场文书
讲座开场白台词和结束语
2015/05/29 职场文书
庆祝教师节新闻稿
2015/07/17 职场文书
汽车车尾标语大全
2015/08/11 职场文书