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

这是最直接的方法,严格照着数学定义来:F(0)=0,F(1)=1,F(n)=F(n−1)+F(n−2)(n≥2)。每次调用都会拆成两个更小的子问题,直到递归到底。
具体步骤是这样的:
fibonacci($n),接收一个整数参数。fibonacci($n - 1) + fibonacci($n - 2)。fibonacci(10) 就能得到第10项(从0开始计数)的值 55。这种方法虽然简单,但有个明显的硬伤:重复计算太多,时间复杂度是 O(2ⁿ),n 稍微大一点就慢得离谱。
既然基础递归有大量重复计算,那最简单的优化就是把算过的结果存起来,下次直接取。用 PHP 的静态数组就能搞定。
做法如下:
static $cache = [],用来存储已经计算过的项。$cache 里,如果是,直接返回 $cache[$n]。$cache[$n] 里。$cache[$n] 的值。这样一来,每个 n 只计算一次,效率大大提升,时间复杂度降到 O(n)。
PHP 本身并不支持尾递归优化,但我们可以在写法上模拟尾递归:通过额外参数传递累计值,让递归调用出现在函数的末尾。这样逻辑更清晰,也方便人工追踪执行路径。
具体实现:
fibonacci_tail($n, $a = 0, $b = 1),其中 $a 对应 F(0),$b 对应 F(1)。fibonacci_tail($n - 1, $b, $a + $b)。fibonacci_tail(10, 0, 1) 得到结果 55。这种写法虽然没有性能上的优化(因为 PHP 不会帮你做尾递归消除),但逻辑上更接近迭代,写起来也舒服。
前面的方法都只返回单个数值,有时候我们需要直接输出前 n 项组成的数组。那可以用递归逐步构建完整数组,每层递归追加一项。
思路如下:
fibonacci_array($length, $arr = []),$length 是目标数组长度,$arr 初始为空数组。$len = count($arr)。$arr[$len-1] + $arr[$len-2]。count($arr) < $length,就继续递归调用自身,否则返回 $arr。调用 fibonacci_array(10) 就能得到一个包含前 10 项的完整数组。
以上就是四种递归实现斐波那契数列的方法。基础递归适合理解原理,记忆化递归解决了性能问题,尾递归风格让代码更易读,而递归构建数组则直接输出数列。实际开发中,如果 n 不大,直接上基础递归也无妨;但追求效率的话,记忆化是个不错的选择。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8