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实现mysql数据库备份类
Mar 20 PHP
PHP 数组实例说明
Aug 18 PHP
Base64在线编码解码实现代码 演示与下载
Jan 08 PHP
初品cakephp 入门基础
Feb 16 PHP
PHP获取当前完整URL地址的函数
Dec 21 PHP
PHP实现懒加载的方法
Mar 07 PHP
php自定义hash函数实例
May 05 PHP
php 在线导入mysql大数据程序
Jun 11 PHP
php+ajax实现无刷新数据分页的办法
Nov 02 PHP
全面了解PHP中的全局变量
Jun 17 PHP
php下载文件,添加响应头的简单实例
Sep 22 PHP
详解php实现页面静态化原理
Jun 21 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实现异步数据调用的方法
2015/12/24 PHP
PHP简单实现欧拉函数Euler功能示例
2017/11/06 PHP
jQuery+PHP实现图片上传并提交功能
2020/07/27 PHP
fromCharCode和charCodeAt 方法
2006/12/27 Javascript
总结AJAX相关JS代码片段和浏览器模型
2007/08/15 Javascript
遨游,飞飞,IE,空中网 浏览器无提示关闭方法
2011/07/11 Javascript
JS实现控制表格只显示行边框或者只显示列边框的方法
2015/03/31 Javascript
JS制作手机端自适应缩放显示
2015/06/11 Javascript
js纯数字逐一停止显示效果的实现代码
2016/03/16 Javascript
JavaScript中instanceof运算符的使用示例
2016/06/08 Javascript
微信小程序 icon组件详细及实例代码
2016/10/25 Javascript
使用JS批量选中功能实现更改数据库中的status状态值(批量展示)
2016/11/22 Javascript
JS检测数组类型的方法小结
2017/03/14 Javascript
jQuery之动画ajax事件(实例讲解)
2017/07/18 jQuery
限时抢购-倒计时的完整实例(分享)
2017/09/17 Javascript
JS和JQuery实现雪花飘落效果
2017/11/30 jQuery
JS实现的简单拖拽购物车功能示例【附源码下载】
2018/01/03 Javascript
在react-router4中进行代码拆分的方法(基于webpack)
2018/03/08 Javascript
Bootstrap开发中Tab标签页切换图表显示问题的解决方法
2018/07/13 Javascript
webpack开发环境和生产环境的深入理解
2018/11/08 Javascript
jQuery实现可以计算进制转换的计算器
2020/10/19 jQuery
学习python处理python编码问题
2011/03/13 Python
python删除列表中重复记录的方法
2015/04/28 Python
Python利用IPython提高开发效率
2016/08/10 Python
python实现对excel进行数据剔除操作实例
2017/12/07 Python
对Pycharm创建py文件时自定义头部模板的方法详解
2019/02/12 Python
django将网络中的图片,保存成model中的ImageField的实例
2019/08/07 Python
Django实现文件上传和下载功能
2019/10/06 Python
最好的意大利皮夹克:D’Arienzo
2018/12/04 全球购物
切尔西足球俱乐部官方网上商店:Chelsea FC
2019/06/17 全球购物
寒假思想汇报
2014/01/10 职场文书
体育教师自我鉴定
2014/02/12 职场文书
党员国庆节演讲稿范文2014
2014/09/21 职场文书
2015年度校学生会工作总结报告
2015/05/23 职场文书
2015年暑假工作总结
2015/07/13 职场文书
python如何将mat文件转为png
2022/07/15 Python