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 上一篇,下一篇文章实现代码与原理说明
May 09 PHP
php excel类 phpExcel使用方法介绍
Aug 21 PHP
解决File size limit exceeded 错误的方法
Jun 14 PHP
ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单
May 15 PHP
PHP使用range协议实现输出文件断点续传代码实例
Jul 04 PHP
php实现的mongodb操作类实例
Apr 03 PHP
php flush无效,IIS7下php实时输出的方法
Aug 25 PHP
PHP实现的XML操作类【XML Library】
Dec 29 PHP
ThinkPHP 3.2.2实现事务操作的方法
May 05 PHP
php7 安装yar 生成docker镜像
May 09 PHP
thinkPHP5框架中widget的功能与用法详解
Jun 11 PHP
PHP isset empty函数相关面试题及解析
Dec 11 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+mysql事务rollback&amp;commit示例
2010/02/08 PHP
PHP 学习路线与时间表
2010/02/21 PHP
php计算两个坐标(经度,纬度)之间距离的方法
2015/04/17 PHP
php解决和避免form表单重复提交的几种方法
2016/08/31 PHP
js 事件小结 表格区别
2007/08/13 Javascript
JavaScript 组件之旅(一)分析和设计
2009/10/28 Javascript
javascript常用方法、属性集合及NodeList 和 HTMLCollection 的浏览器差异
2010/12/25 Javascript
jQuery动态添加 input type=file的实现代码
2012/06/14 Javascript
自动刷新网页,自动刷新当前页面,JS调用
2013/06/24 Javascript
JavaScript学习笔记之取数组中最大值和最小值
2016/03/23 Javascript
JavaScript常见的五种数组去重的方式
2016/12/15 Javascript
深入理解js 中async 函数的含义和用法
2018/05/13 Javascript
vue的三种图片引入方式代码实例
2019/11/19 Javascript
我所理解的JavaScript中的this指向
2020/09/04 Javascript
对python中的 os.mkdir和os.mkdirs详解
2018/10/16 Python
对python捕获ctrl+c手工中断程序的两种方法详解
2018/12/26 Python
对python 通过ssh访问数据库的实例详解
2019/02/19 Python
python for和else语句趣谈
2019/07/02 Python
python 利用pywifi模块实现连接网络破解wifi密码实时监控网络
2019/09/16 Python
Flask中sqlalchemy模块的实例用法
2020/08/02 Python
Python命名空间及作用域原理实例解析
2020/08/12 Python
Selenium 配置启动项参数的方法
2020/12/04 Python
html5的canvas方法使用指南
2014/12/15 HTML / CSS
全球最大的游戏市场:G2A
2018/07/05 全球购物
英国领先的票务代理商之一:The Ticket Factory
2019/02/09 全球购物
一些Unix笔试题和面试题
2013/01/22 面试题
消防安全标语
2014/06/07 职场文书
管理岗位竞聘演讲稿
2014/08/18 职场文书
颐和园英文导游词
2015/01/30 职场文书
公司聚餐通知
2015/04/22 职场文书
个人求职意向书
2015/05/11 职场文书
关于元旦的广播稿2016
2015/12/17 职场文书
导游词之西江千户苗寨
2019/12/24 职场文书
Nginx配置SSL证书出错解决方案
2021/03/31 Servers
解析Java中的static关键字
2021/06/14 Java/Android
Apache Pulsar集群搭建部署详细过程
2022/02/12 Servers