递归实现斐波那契易爆栈,因php默认嵌套深度限制(如xdebug.max_nesting_level=256),仅适用于教学;生产环境应使用循环迭代,初始化$a=0,$b=1,用$arr[]=$a高效追加,兼顾性能与边界处理。

用 fibonacci() 递归函数容易爆栈
PHP 默认递归深度有限,算到第 40 项左右就可能触发 Fatal error: Maximum function nesting level of '256' reached。这不是代码写错了,是 PHP 的 xdebug.max_nesting_level 限制在起作用。
- 只适合教学演示,别在生产环境用纯递归生成长序列
- 每次调用都新建栈帧,
fibonacci(45)实际会执行上百万次函数调用 - 如果真要用递归,加个记忆化缓存:用静态数组存已算过的值,比如
static $cache = [];,查表优先
用 for 循环生成数列最稳
循环不依赖调用栈,内存占用低,速度也快,适合生成前 n 项(比如前 1000 项)。
- 初始化两个变量:
$a = 0; $b = 1;,然后迭代更新 - 注意边界:要生成 1 项,得返回
[0];要生成 0 项,得返回空数组[],别漏判 - 别在循环里反复调用
array_push(),直接用$arr[] = $a;更轻量
$n = 10;
$fib = [];
$a = 0; $b = 1;
for ($i = 0; $i < $n; $i++) {
$fib[] = $a;
$next = $a + $b;
$a = $b;
$b = $next;
}
用 Generator 处理超长数列
当你要“遍历”斐波那契数列但不确定要多少项(比如流式处理、配合 foreach 或 LimitIterator),用生成器比一次性生成数组更合理。
- 不会把全部数字塞进内存,适合做无限序列的切片
- 函数必须用
yield,返回的是Generator对象,不是数组 - PHP 5.5+ 才支持,老版本别硬套
function fibonacci(): Generator {
$a = 0; $b = 1;
while (true) {
yield $a;
$next = $a + $b;
$a = $b;
$b = $next;
}
}
// 取前 15 项:
foreach (new LimitIterator(fibonacci(), 0, 15) as $val) {
echo $val . ' ';
}
bcadd() 是大数场景的唯一出路
PHP 整型有上限(通常是 64 位),第 94 项斐波那契数就超出 PHP_INT_MAX,再往后会变浮点甚至科学计数法,精度丢失。
立即学习“PHP免费学习笔记(深入)”;
- 只要项数可能 ≥ 90,就得用 BCMath 扩展,确保用
bcadd($a, $b)替代+ - 所有中间值都得是字符串,比如
$a = '0'; $b = '1'; - 确认服务器开了
bcmath扩展,否则运行时报Call to undefined function bcadd()
Generator;要算到几百项还不丢精度?绕不开 bcadd()。很多人卡在第 93 项之后结果不对,就是忘了切换到高精度计算。











