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 相关文章推荐
基于文本的访客签到簿
Oct 09 PHP
在php中判断一个请求是ajax请求还是普通请求的方法
Jun 28 PHP
PHP mcrypt可逆加密算法分析
Jul 19 PHP
用PHP编写和读取XML的几种方式
Jan 12 PHP
php数组(array)输出的三种形式详解
Jun 05 PHP
destoon找回管理员密码的方法
Jun 21 PHP
PHP保存带BOM文件的方法
Feb 12 PHP
laravel安装zend opcache加速器教程
Mar 02 PHP
浅析php设计模式之数据对象映射模式
Mar 03 PHP
PHP使用PDO操作数据库的乱码问题解决方法
Apr 08 PHP
php实现转换html格式为文本格式的方法
May 16 PHP
总结PHP中初始化空数组的最佳方法
Feb 13 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通过iconv将字符串从GBK转换为UTF8字符集
2011/07/18 PHP
PHP获取input输入框中的值去数据库比较显示出来
2016/11/16 PHP
php实现推荐功能的简单实例
2019/09/29 PHP
Yii框架布局文件的动态切换操作示例
2019/11/11 PHP
PHP 扩展Memcached命令用法实例总结
2020/06/04 PHP
PHP序列化和反序列化深度剖析实例讲解
2020/12/29 PHP
jQuery的实现原理的模拟代码 -5 Ajax
2010/08/07 Javascript
JS弹出窗口代码大全(详细整理)
2012/12/21 Javascript
一个非常全面的javascript URL解析函数和分段URL解析方法
2014/04/12 Javascript
JavaScript函数作用域链分析
2015/02/13 Javascript
CSS图片响应式 垂直水平居中
2015/08/14 Javascript
javascript+css3 实现动态按钮菜单特效
2016/02/06 Javascript
AngularJS 所有版本下载地址
2016/09/14 Javascript
Nodejs读取文件时相对路径的正确写法(使用fs模块)
2017/04/27 NodeJs
vue.js如何更改默认端口号8080为指定端口的方法
2017/07/14 Javascript
vue.js响应式原理解析与实现
2020/06/22 Javascript
Layui 导航默认展开和菜单栏选中高亮设置的方法
2019/09/04 Javascript
微信小程序中weui用法解析
2019/10/21 Javascript
JS实现简单省市二级联动
2019/11/27 Javascript
JavaScript自定义超时API代码实例
2020/04/30 Javascript
echarts.js 动态生成多个图表 使用vue封装组件操作
2020/07/19 Javascript
详解微信小程序入门从这里出发(登录注册、开发工具、文件及结构介绍)
2020/07/21 Javascript
Openlayers绘制聚合标注
2020/09/28 Javascript
Python爬豆瓣电影实例
2018/02/23 Python
Python 隐藏输入密码时屏幕回显的实例
2019/02/19 Python
pytorch载入预训练模型后,实现训练指定层
2020/01/06 Python
将tf.batch_matmul替换成tf.matmul的实现
2020/06/18 Python
python通过函数名调用函数的几种场景
2020/09/23 Python
Python提取视频中图片的示例(按帧、按秒)
2020/10/22 Python
Ibatis的核心配置文件都有什么
2014/09/08 面试题
介绍一下SOA和SOA的基本特征
2016/02/24 面试题
招商业务员岗位职责
2013/12/16 职场文书
劳动实践课感言
2014/02/01 职场文书
参观接待方案
2014/03/17 职场文书
管理提升方案
2014/06/04 职场文书
2016年感恩节活动总结大全
2016/04/01 职场文书