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 相关文章推荐
介绍几个array库的新函数 php
Dec 29 PHP
php 删除数组元素
Jan 16 PHP
PHP 数据库树的遍历方法
Feb 06 PHP
自己在做项目过程中学到的PHP知识收集
Aug 20 PHP
浅谈PHP强制类型转换,慎用!
Jun 06 PHP
PHP Global定义全局变量使用说明
Aug 15 PHP
php实现图片缩放功能类
Dec 18 PHP
ThinkPHP多表联合查询的常用方法
Mar 24 PHP
php批量添加数据与批量更新数据的实现方法
Dec 16 PHP
Yii视图CGridView列表用法实例分析
Jul 12 PHP
php结合redis高并发下发帖、发微博的实现方法
Dec 15 PHP
php实现微信公众平台发红包功能
Jun 14 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下将XML转换为数组
2010/01/01 PHP
整理的9个实用的PHP库简介和下载
2010/11/09 PHP
javascript数组与php数组的地址传递及值传递用法实例
2015/01/22 PHP
jQuery向下滚动即时加载内容实现的瀑布流效果
2016/01/07 PHP
PHP编程实现csv文件导入mysql数据库的方法
2017/04/29 PHP
JQuery实现简单时尚快捷的气泡提示插件
2012/12/20 Javascript
批量实现面向对象的实例代码
2013/07/01 Javascript
移动节点的jquery代码
2014/01/13 Javascript
jQuery实现按键盘方向键翻页特效
2015/03/18 Javascript
微信小程序iBeacon测距及稳定程序的实现解析
2019/07/31 Javascript
vue实现鼠标经过动画
2019/10/16 Javascript
[03:07]DOTA2英雄基础教程 冰霜诅咒极寒幽魂
2013/12/06 DOTA
[02:38]2018DOTA2亚洲邀请赛赛前采访-VGJ.T
2018/04/03 DOTA
python list 合并连接字符串的方法
2013/03/09 Python
python执行等待程序直到第二天零点的方法
2015/04/23 Python
Python基于Tkinter的HelloWorld入门实例
2015/06/17 Python
Python查询IP地址归属完整代码
2017/06/21 Python
Python实现的FTP通信客户端与服务器端功能示例
2018/03/28 Python
在Python中调用Ping命令,批量IP的方法
2019/01/26 Python
Python3.5迭代器与生成器用法实例分析
2019/04/30 Python
python的set处理二维数组转一维数组的方法示例
2019/05/31 Python
Python读取JSON数据操作实例解析
2020/05/18 Python
Habitat家居英国官方网站:沙发、家具、照明、厨房和户外
2019/12/12 全球购物
泰国排名第一的家居用品中心:HomePro
2020/11/18 全球购物
Bandier官网:奢侈、时尚前卫的健身服装首选目的地
2020/07/05 全球购物
JavaScript实现页面动态验证码的实现示例
2021/03/23 Javascript
小学教师自我鉴定范文
2014/03/20 职场文书
医院护士见习期自我鉴定
2014/04/10 职场文书
设计顾问服务计划书
2014/05/04 职场文书
户外宣传策划方案
2014/05/25 职场文书
团队口号大全
2014/06/06 职场文书
班级标语大全
2014/06/21 职场文书
CSS 文字装饰 text-decoration & text-emphasis 详解
2021/04/06 HTML / CSS
Golang中异常处理机制详解
2021/06/08 Golang
如何开启Apache,Nginx和IIS服务器的GZIP压缩功能
2022/04/29 Servers
使用vuex-persistedstate本地存储vuex
2022/04/29 Vue.js