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注销代码(session注销)
May 31 PHP
浅析php面向对象public private protected 访问修饰符
Jun 30 PHP
php curl基本操作详解
Jul 23 PHP
php中current、next与reset函数用法实例
Nov 17 PHP
php微信开发之上传临时素材
Jun 24 PHP
PHP中include/require/include_once/require_once使用心得
Aug 28 PHP
浅谈mysql_query()函数的返回值问题
Sep 05 PHP
Laravel 5.1 on SAE环境开发教程【附项目demo源码】
Oct 09 PHP
PHP编程 SSO详细介绍及简单实例
Jan 13 PHP
Laravel5.* 打印出执行的sql语句的方法
Jul 24 PHP
PHP的mysqli_set_charset()函数讲解
Jan 23 PHP
PHP单元测试配置与使用方法详解
Dec 27 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
解析阿里云ubuntu12.04环境下配置Apache+PHP+PHPmyadmin+MYsql
2013/06/26 PHP
php计算年龄精准到年月日
2015/11/17 PHP
javascript+xml技术实现分页浏览
2008/07/27 Javascript
Jquery实现控件的隐藏和显示实例
2014/02/08 Javascript
利用JQuery和Servlet实现跨域提交请求示例分享
2014/02/12 Javascript
基于jquery实现在线选座订座之影院篇
2015/08/24 Javascript
jquery+CSS3模拟Path2.0动画菜单效果代码
2015/08/31 Javascript
js提示框替代系统alert,自动关闭alert对话框的实现方法
2016/11/07 Javascript
js 实现省市区三级联动菜单效果
2017/02/20 Javascript
详解vue2.0脚手架的webpack 配置文件分析
2017/05/27 Javascript
json2.js 入门教程之使用方法与实例分析
2017/09/14 Javascript
Vuejs中使用markdown服务器端渲染的示例
2017/11/22 Javascript
p5.js入门教程之小球动画示例代码
2018/03/15 Javascript
微信小程序页面滚动到指定位置代码实例
2019/09/07 Javascript
angula中使用iframe点击后不执行变更检测的问题
2020/05/10 Javascript
python实现登陆知乎获得个人收藏并保存为word文件
2015/03/16 Python
使用PDB简单调试Python程序简明指南
2015/04/25 Python
利用Python暴力破解zip文件口令的方法详解
2017/12/21 Python
解决python 输出是省略号的问题
2018/04/19 Python
用Python实现二叉树、二叉树非递归遍历及绘制的例子
2019/08/09 Python
python3实现微型的web服务器
2019/09/03 Python
使用Python代码实现Linux中的ls遍历目录命令的实例代码
2019/09/07 Python
python通过链接抓取网站详解
2019/11/20 Python
对python中各个response的使用说明
2020/03/28 Python
PageFactory设计模式基于python实现
2020/04/14 Python
css3实现超立体3D图片侧翻倾斜效果
2014/04/16 HTML / CSS
中国综合性网上购物商城:当当(网上卖书起家)
2016/11/16 全球购物
Vision Directa智利眼镜网:框架眼镜、隐形眼镜和名牌太阳眼镜
2016/11/23 全球购物
送给他或她的礼物:FUN.com
2018/08/17 全球购物
台湾屈臣氏网路商店:Watsons台湾
2020/12/29 全球购物
办公室秘书自我鉴定
2014/01/18 职场文书
酒店开业庆典主持词
2014/03/21 职场文书
群众路线教育实践活动剖析材料
2014/09/30 职场文书
工伤事故赔偿协议书
2015/08/06 职场文书
2019同学聚会主持词
2019/05/06 职场文书
python通过新建环境安装tfx的问题
2022/05/20 Python