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 相关文章推荐
JAVA/JSP学习系列之四
Oct 09 PHP
php面向对象全攻略 (十七) 自动加载类
Sep 30 PHP
PHP 采集程序中常用的函数
Dec 09 PHP
php启动时候提示PHP startup的解决方法
May 07 PHP
利用PHP实现图片等比例放大和缩小的方法详解
Jun 06 PHP
coreseek 搜索英文的问题详解
Jun 08 PHP
利用php递归实现无限分类 格式化数组的详解
Jun 08 PHP
实现PHP多线程异步请求的3种方法
Jan 17 PHP
PHP检测字符串是否为UTF8编码的常用方法
Nov 21 PHP
jquery+thinkphp实现跨域抓取数据的方法
Oct 15 PHP
Zend Framework处理Json数据方法详解
Dec 09 PHP
Yii框架参数化查询中IN查询只能查询一个的解决方法
May 20 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
用mysql_fetch_array()获取当前行数据的方法详解
2013/06/05 PHP
php获取Google机器人访问足迹的方法
2015/04/15 PHP
最新制作ThinkPHP3.2.3完全开发手册
2015/11/23 PHP
PHP实现一个简单url路由功能实例
2016/11/05 PHP
js前台判断开始时间是否小于结束时间
2012/02/23 Javascript
JavaScript高级程序设计 阅读笔记(十八) js跨平台的事件
2012/08/14 Javascript
jquery解析XML字符串和XML文件的方法说明
2014/02/21 Javascript
Javscript删除数组中指定元素并返回新数组
2014/03/06 Javascript
谷歌地图打不开的解决办法
2014/08/07 Javascript
JavaScript从数组中删除指定值元素的方法
2015/03/18 Javascript
JS实现控制表格行文本对齐的方法
2015/03/30 Javascript
javascript实现信息增删改查的方法
2015/07/25 Javascript
Jquery跨浏览器文本复制插件Zero Clipboard的使用方法
2016/02/28 Javascript
轻松掌握JavaScript单例模式
2016/08/25 Javascript
扩展jquery easyui tree的搜索树节点方法(推荐)
2016/10/28 Javascript
Node.js websocket使用socket.io库实现实时聊天室
2017/02/20 Javascript
浅谈Vue.js中的v-on(事件处理)
2017/09/05 Javascript
关于vue中watch检测到不到对象属性的变化的解决方法
2018/02/08 Javascript
Python中的pygal安装和绘制直方图代码分享
2017/12/08 Python
利用Python正则表达式过滤敏感词的方法
2019/01/21 Python
Python实现程序判断季节的代码示例
2019/01/28 Python
python接口自动化(十六)--参数关联接口后传(详解)
2019/04/16 Python
将python安装信息加入注册表的示例
2019/11/20 Python
Python打开文件、文件读写操作、with方式、文件常用函数实例分析
2020/01/07 Python
css3遮罩层镂空效果的多种实现方法
2020/05/11 HTML / CSS
实例讲解使用HTML5 Canvas绘制阴影效果的方法
2016/03/25 HTML / CSS
世界领先的豪华床上用品供应商之一:Bedeck Home
2019/03/18 全球购物
卫校中专生的自我评价
2014/01/15 职场文书
普通员工辞职信
2014/01/17 职场文书
2014年迎新年活动方案
2014/02/19 职场文书
会计试用期自我评价怎么写
2014/09/18 职场文书
捐助倡议书
2015/01/19 职场文书
2015年五一劳动节慰问信
2015/03/23 职场文书
中国现代文学之经典散文三篇
2019/09/18 职场文书
MySQL连接查询你真的学会了吗?
2021/06/02 MySQL
Python 详解通过Scrapy框架实现爬取百度新冠疫情数据流程
2021/11/11 Python