递归调用必须显式 return,否则上层收不到值;多路递归需分别接收并合并子结果;每个分支、基准情况都须有正确返回值;深度过大时建议改用迭代。

递归调用没加 return 导致上层收不到值
这是最常见、也最容易被忽略的问题:函数内部调用了自己,但没把结果 return 出去。PHP 不会自动把子调用的返回值“冒泡”上来,必须显式写 return。
- 错误写法:
recursive($next);—— 这行执行完就继续往下走,子调用的返回值直接丢弃 - 正确写法:
return recursive($next);—— 把子调用结果原样或加工后返回 - 特别注意
if/else分支:每个分支都得有return,漏掉一个(比如只有if有return,else没写)就会让该路径返回null - 调试时可在每条
return前加var_dump($result);,确认真正返回的是什么
多路递归(如树左右子节点)没合并返回值
当一次递归要处理多个子调用(比如遍历二叉树的 left 和 right),必须分别接收、处理、再合并,不能只调用不收集。
- 错误写法:
traverse($node->left); traverse($node->right); return $data;—— 两个子调用的结果全丢了 - 正确写法:
$left = traverse($node->left); $right = traverse($node->right); return array_merge($left, $right); - 如果返回的是布尔值(比如“是否存在某节点”),要用
||或&&组合:return $leftFound || $rightFound; - 数组类结果别用
array_push()后忘了return,常见坑:array_push($result, $left); return $result;——$left没被接住
终止条件没返回值或返回了错误类型
基准情况(base case)看似简单,但一旦没 return,或者返回了空数组/空字符串/null,上层所有计算都会塌陷。
- 检查每个
if ($n 这类条件分支末尾是否真有 <code>return,而不是只写了echo或break - 避免在终止条件里返回
0或false,除非业务明确需要——它们会被empty()当成空,干扰后续逻辑 - 如果函数预期返回数组,终止时别返回
''或null,而应返回[];反之亦然 - 加一句
die('base case hit: ' . var_export($value, true));确认它真被执行且返回了期望值
递归深度超限导致提前中断
不是逻辑错,是 PHP 直接不让跑了。Fatal error: Maximum function nesting level of '256' reached 这种错误会让递归在中途戛然而止,看起来像“结果丢失”,其实是根本没跑完。
立即学习“PHP免费学习笔记(深入)”;
- 默认
xdebug.max_nesting_level=256,但 10 层嵌套 × 每层循环 30 次,很容易撞上限 - 加深度参数控制:
function foo($data, $depth = 0, $maxDepth = 20) { if ($depth > $maxDepth) return []; ... return foo($next, $depth + 1, $maxDepth); } - 大数组优先考虑迭代替代递归:用
stack = [$root]+while (!empty($stack))模拟调用栈,彻底避开嵌套限制 - 运行前先
var_dump($data)看结构深度,别等报错才意识到数据比预想的深得多
return 得写对位置,深度得控得住。最容易被绕晕的,就是某一层忘了 return,然后整条链上的结果全空。



















