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 相关文章推荐
教你IIS6的PHP最佳配置方法
Sep 05 PHP
高亮度显示php源代码
Oct 09 PHP
最小化数据传输――在客户端存储数据
Oct 09 PHP
PHP gbk环境下json_dencode传送来的汉字
Nov 13 PHP
解析dedeCMS验证码的实现代码
Jun 07 PHP
请离开include_once和require_once
Jul 18 PHP
php判断字符串在另一个字符串位置的方法
Feb 27 PHP
PHP中开启gzip压缩的2种方法
Jan 31 PHP
php实现网页缓存的工具类分享
Jul 14 PHP
php上传大文件失败的原因及应对策略
Oct 20 PHP
优化WordPress中文章与评论的时间显示
Jan 12 PHP
详解Laravel制作API接口
May 31 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
判“新”函数:得到今天与明天的秒数
2006/10/09 PHP
PHP中英混合字符串截取函数代码
2011/07/17 PHP
php图片的裁剪与缩放生成符合需求的缩略图
2013/01/11 PHP
php使用PDO方法详解
2014/12/27 PHP
PHPMailer使用QQ邮箱实现邮件发送功能
2017/08/18 PHP
php操作redis数据库常见方法实例总结
2020/02/20 PHP
PHP如何通过带尾指针的链表实现'队列'
2020/10/22 PHP
js中使用DOM复制(克隆)指定节点名数据到新的XML文件中的代码
2011/07/27 Javascript
Js日期选择器并自动加入到输入框中示例代码
2013/08/02 Javascript
Query中click(),bind(),live(),delegate()的区别
2013/11/19 Javascript
JQuery中节点遍历方法实例
2015/05/18 Javascript
jquery插件uploadify实现带进度条的文件批量上传
2015/12/13 Javascript
bootstrap使用validate实现简单校验功能
2016/12/02 Javascript
详解Angular路由 ng-route和ui-router的区别
2017/05/22 Javascript
vue2组件之select2调用的示例代码
2017/10/12 Javascript
vue组件的写法汇总
2018/04/12 Javascript
详解如何解决Vue和vue-template-compiler版本之间的问题
2018/09/17 Javascript
Vue CLI3 开启gzip压缩文件的方式
2018/09/30 Javascript
NodeJs 文件系统操作模块fs使用方法详解
2018/11/26 NodeJs
JS实现页面跳转与刷新的方法汇总
2019/08/30 Javascript
Vue利用Blob下载原生二进制数组文件
2019/09/25 Javascript
微信小程序关键字变色实现代码实例
2019/12/13 Javascript
详解基于element的区间选择组件校验(交易金额)
2021/01/07 Javascript
详解Python中__str__和__repr__方法的区别
2015/04/17 Python
Python运算符重载用法实例分析
2015/06/01 Python
使用python读取.text文件特定行的数据方法
2019/01/28 Python
详解python深浅拷贝区别
2019/06/24 Python
修改 CentOS 6.x 上默认Python的方法
2019/09/06 Python
利用CSS3实现自定义滚动条代码分享
2016/08/18 HTML / CSS
POS解决方案:MUNBYN(热敏打印机、条形码扫描仪)
2020/06/09 全球购物
酒店端午节促销方案
2014/02/18 职场文书
新文化运动的基本口号
2014/06/21 职场文书
新店开张活动方案
2014/08/24 职场文书
爱晚亭导游词
2015/02/09 职场文书
2015年小学中秋节活动总结
2015/03/23 职场文书
nginx配置虚拟主机的详细步骤
2021/07/21 Servers