斐波那契数列php实现有递归与迭代两种主流方式:递归简洁但时间复杂度o(2ⁿ),n>40时性能骤降;迭代法空间o(1)、时间o(n),高效稳定,推荐实际应用。

斐波那契数列(Fibonacci Sequence)是经典的递推问题:从第3项起,每一项都等于前两项之和,即 F(0)=0, F(1)=1, F(n)=F(n−1)+F(n−2)(n≥2)。PHP 中有多种实现方式,关键在于根据场景权衡时间复杂度、空间占用与可读性。
递归实现(简洁但低效)
最直观的写法,直接对应数学定义:
function fibRecursive($n) {
if ($n < 0) return null;
if ($n === 0) return 0;
if ($n === 1) return 1;
return fibRecursive($n - 1) + fibRecursive($n - 2);
}
⚠️ 注意:该方法存在大量重复计算,时间复杂度为 O(2ⁿ),n > 40 就明显卡顿,仅适合教学演示或极小输入。
动态规划(推荐:自底向上迭代)
用两个变量滚动更新,空间 O(1)、时间 O(n),稳定高效,适合大多数实际需求:
立即学习“PHP免费学习笔记(深入)”;
function fibIterative($n) {
if ($n < 0) return null;
if ($n === 0) return 0;
if ($n === 1) return 1;
<pre class='brush:php;toolbar:false;'>$a = 0; $b = 1;
for ($i = 2; $i <= $n; $i++) {
$temp = $a + $b;
$a = $b;
$b = $temp;
}
return $b;}
- 适用于求单个大项(如第 10000 项),不会栈溢出
- 可轻松扩展为生成前 n 项数组(只需在循环中 push)
- 整数溢出需注意:PHP 7+ 默认使用 64 位整型,F(93) 已超最大值,更大值建议用
gmp_add()或字符串处理
记忆化递归(兼顾清晰与性能)
在递归基础上缓存已算结果,避免重复调用,时间复杂度降为 O(n),适合需多次调用不同 n 的场景:
function fibMemo($n, &$memo = []) {
if ($n < 0) return null;
if ($n === 0) return 0;
if ($n === 1) return 1;
if (isset($memo[$n])) return $memo[$n];
<pre class='brush:php;toolbar:false;'>$memo[$n] = fibMemo($n - 1, $memo) + fibMemo($n - 2, $memo);
return $memo[$n];}
- 首次调用后,后续同参数调用几乎为 O(1)
- $memo 用引用传递,避免每次重建数组
- 若需封装成独立函数,可改用静态变量或类属性保存缓存
生成器实现(内存友好,适合遍历)
当需要逐项输出或处理前若干项(如分页展示、流式计算),生成器比一次性生成数组更省内存:
function fibGenerator($limit) {
if ($limit <= 0) return;
$a = 0; yield $a;
if ($limit === 1) return;
$b = 1; yield $b;
<pre class='brush:php;toolbar:false;'>for ($i = 2; $i < $limit; $i++) {
$c = $a + $b;
yield $c;
$a = $b;
$b = $c;
}}
// 使用示例 foreach (fibGenerator(10) as $val) { echo $val . ' '; } // 输出:0 1 1 2 3 5 8 13 21 34
- 不预先分配数组,每项按需产出
- 配合
break或limit iterator可灵活控制终止条件 - 适合与协程、异步 I/O 结合处理大数据流
不复杂但容易忽略:实际项目中优先选迭代法;调试时可用递归理解逻辑;高频查询用记忆化;流式场景用生成器。根据输入规模、调用频次和内存约束选最合适的那一版即可。











