商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > PHP如何实现斐波那契数列递归_PHP实现斐波那契数列递归方法【算法】

PHP如何实现斐波那契数列递归_PHP实现斐波那契数列递归方法【算法】

  发布于2026-07-19 阅读(0)

扫一扫,手机访问

PHP 递归实现斐波那契数列:四种方法详解

在 PHP 里用递归生成斐波那契数列,其实是个非常经典的练手场景。斐波那契数列的定义大家应该都熟悉:F(0)=0,F(1)=1,之后的每一项都是前两项之和。如果要用递归来实现,那核心就是让函数不断调用自身,直到触底。下面整理了四种常见的递归写法,从最基础的到带优化的,再到生成完整数组的,你可以根据实际需求来选。

PHP如何实现斐波那契数列递归_PHP实现斐波那契数列递归方法【算法】

一、基础递归实现

这是最直接的方法,严格照着数学定义来:F(0)=0,F(1)=1,F(n)=F(n−1)+F(n−2)(n≥2)。每次调用都会拆成两个更小的子问题,直到递归到底。

具体步骤是这样的:

  • 创建一个函数 fibonacci($n),接收一个整数参数。
  • 在函数里判断:如果 $n 等于 0,直接返回 0;如果 $n 等于 1,返回 1
  • 否则,返回 fibonacci($n - 1) + fibonacci($n - 2)
  • 调用 fibonacci(10) 就能得到第10项(从0开始计数)的值 55

这种方法虽然简单,但有个明显的硬伤:重复计算太多,时间复杂度是 O(2ⁿ),n 稍微大一点就慢得离谱。

二、带记忆化的递归实现

既然基础递归有大量重复计算,那最简单的优化就是把算过的结果存起来,下次直接取。用 PHP 的静态数组就能搞定。

做法如下:

  • 在函数内部声明 static $cache = [],用来存储已经计算过的项。
  • 每次调用时先检查 $n 是否已经在 $cache 里,如果是,直接返回 $cache[$n]
  • 如果没缓存,就按基础递归的逻辑计算结果,然后把结果存到 $cache[$n] 里。
  • 最后返回 $cache[$n] 的值。

这样一来,每个 n 只计算一次,效率大大提升,时间复杂度降到 O(n)。

三、尾递归风格实现(模拟)

PHP 本身并不支持尾递归优化,但我们可以在写法上模拟尾递归:通过额外参数传递累计值,让递归调用出现在函数的末尾。这样逻辑更清晰,也方便人工追踪执行路径。

具体实现:

  • 定义函数 fibonacci_tail($n, $a = 0, $b = 1),其中 $a 对应 F(0),$b 对应 F(1)。
  • 当 $n 等于 0 时,返回 $a;当 $n 等于 1 时,返回 $b
  • 否则,递归调用 fibonacci_tail($n - 1, $b, $a + $b)
  • 调用 fibonacci_tail(10, 0, 1) 得到结果 55

这种写法虽然没有性能上的优化(因为 PHP 不会帮你做尾递归消除),但逻辑上更接近迭代,写起来也舒服。

四、递归生成指定长度数列数组

前面的方法都只返回单个数值,有时候我们需要直接输出前 n 项组成的数组。那可以用递归逐步构建完整数组,每层递归追加一项。

思路如下:

  • 定义函数 fibonacci_array($length, $arr = []),$length 是目标数组长度,$arr 初始为空数组。
  • 计算当前数组长度 $len = count($arr)
  • 如果 $len 为 0,向 $arr 追加 0;如果 $len 为 1,追加 1;否则追加 $arr[$len-1] + $arr[$len-2]
  • 如果 count($arr) < $length,就继续递归调用自身,否则返回 $arr。

调用 fibonacci_array(10) 就能得到一个包含前 10 项的完整数组。

以上就是四种递归实现斐波那契数列的方法。基础递归适合理解原理,记忆化递归解决了性能问题,尾递归风格让代码更易读,而递归构建数组则直接输出数列。实际开发中,如果 n 不大,直接上基础递归也无妨;但追求效率的话,记忆化是个不错的选择。

本文转载于:https://www.php.cn/faq/2313141.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注