PHP怎么生成斐波那契数列_PHP递归循环实现方法【教程】

6次阅读

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

PHP怎么生成斐波那契数列_PHP递归循环实现方法【教程】

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 处理超长数列

当你要“遍历”斐波那契数列但不确定要多少项(比如流式处理、配合 foreachLimitIterator),用生成器比一次性生成数组更合理。

  • 不会把全部数字塞进内存,适合做无限序列的切片
  • 函数必须用 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 项之后结果不对,就是忘了切换到高精度计算。

text=ZqhQzanResources