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 相关文章推荐
一个ORACLE分页程序,挺实用的.
Oct 09 PHP
模仿OSO的论坛(五)
Oct 09 PHP
PHP伪静态页面函数附使用方法
Jun 20 PHP
php 设计模式之 工厂模式
Dec 19 PHP
PHP安全防范技巧分享
Nov 03 PHP
ThinkPHP3.1查询语言详解
Jun 19 PHP
php mb_substr()函数截取中文字符串应用示例
Jul 29 PHP
PHP反向代理类代码
Aug 15 PHP
变量在 PHP7 内部的实现(二)
Dec 21 PHP
Smarty环境配置与使用入门教程
May 11 PHP
PHP从零开始打造自己的MVC框架之路由类实现方法分析
Jun 03 PHP
PHP实现爬虫爬取图片代码实例
Mar 03 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 第二节 数据类型之转换
2012/04/28 PHP
windows下配置apache+php+mysql时出现问题的处理方法
2014/06/20 PHP
使用ThinkPHP+Uploadify实现图片上传功能
2014/06/26 PHP
PHP单链表的实现代码
2016/07/05 PHP
PHP工厂模式简单实现方法示例
2018/05/23 PHP
jQuery 自动增长的文本输入框实现代码
2010/04/02 Javascript
jQuery版仿Path菜单效果
2011/12/15 Javascript
js实现在同一窗口浏览图片
2014/09/17 Javascript
JS实现控制表格单元格垂直对齐的方法
2015/03/30 Javascript
浅析jQuery移动开发中内联按钮和分组按钮的编写
2015/12/04 Javascript
深入浅析Extjs中store分组功能的使用方法
2016/04/20 Javascript
jQuery控制文本框只能输入数字和字母及使用方法
2016/05/26 Javascript
jqGrid用法汇总(全经典)
2016/06/28 Javascript
基于JS实现9种不同的面包屑和分布式多步骤导航效果
2017/02/21 Javascript
使用JavaScript进行表单校验功能
2017/08/01 Javascript
使用xampp将angular项目运行在web服务器的教程
2019/09/16 Javascript
vue+element_ui上传文件,并传递额外参数操作
2020/12/05 Vue.js
Python 字符串与二进制串的相互转换示例
2018/07/23 Python
使用tensorflow实现线性svm
2018/09/07 Python
python批量下载网站马拉松照片的完整步骤
2018/12/05 Python
Python离线安装PIL 模块的方法
2019/01/08 Python
python调用Matplotlib绘制分布点图
2019/10/18 Python
python 等差数列末项计算方式
2020/05/03 Python
Python实现一个简单的毕业生信息管理系统的示例代码
2020/06/08 Python
详解anaconda安装步骤
2020/11/23 Python
带有css3动画效果的兼容多浏览器简单导航条示例
2014/01/26 HTML / CSS
浅析几个CSS3常用功能的写法
2014/06/05 HTML / CSS
CSS3中的opacity属性使用教程
2015/08/19 HTML / CSS
Html5画布_动力节点Java学院整理
2017/07/13 HTML / CSS
Amara美国站:英国高端家居礼品网站,世界各地的奢侈家具品牌
2017/07/26 全球购物
大学生毕业求职的自我评价
2013/09/29 职场文书
教师自我鉴定范文
2013/11/10 职场文书
门诊手术室工作制度
2014/01/30 职场文书
大学生赌博检讨书
2014/09/22 职场文书
团代会开幕词
2015/01/28 职场文书
2015年秋季灭鼠工作总结
2015/07/27 职场文书