递归函数必须确保所有分支都返回值,避免因遗漏return导致默认返回null;需正确接收、合并子调用结果,并验证终止条件可达性。

所有分支是否都写了 return
PHP 函数默认返回 null,只要某条执行路径没走到 return,结果就是空。递归函数常因 if 分支遗漏、else 缺失或提前 return 而中断回传链。
- 检查每个条件分支(包括
if、elseif、else)末尾是否有return,尤其注意嵌套逻辑里是否漏掉最内层的return - 不要写
recursive($sub);这种调用——它执行了但不接收结果;必须写成$result = recursive($sub); return $result;或直接return recursive($sub); - 用
var_dump(__FUNCTION__, $n, 'exiting');插在函数末尾,确认它真被运行到了
递归调用是否被正确接收和合并
多路递归(如树的左右子节点、数组元素遍历)容易只调用不收值,或收了但没合并就返回,导致上层拿到的是部分结果甚至 null。
- 每个子调用都要赋值给变量:
$left = traverse($node->left);、$right = traverse($node->right); - 合并操作不能省:
return array_merge($left, $right);或return $left + $right;,别忘了return - 对
null做防御性处理:比如if ($result !== null) { return $result; },否则可能跳过有效分支
参数是否在收敛、终止条件是否可达
返回值异常常是假象,根源其实是递归根本没停——卡在某层反复调用,最终超时或内存耗尽,而你只看到 null 或 false。
- 在入口加
echo "depth: $depth, n: $n\n";(配合传入的$depth参数),观察数字是否递减/变化 - 检查终止条件是否覆盖所有可能输入:比如
if ($n 对负数有效,但若传入 <code>"abc"就永远进不去 - 确认参数计算无误:
recursive($n - 1)写成recursive($n)或recursive($n + 1)都会导致不收敛
静态变量或全局状态是否污染了返回值
用 static 缓存或修改全局数组时,多次调用会互相干扰,看起来像“同一输入返回不同值”。
立即学习“PHP免费学习笔记(深入)”;
- 搜索函数体内是否有
static $cache = [];—— 若没清空或没做键校验,上次结果会残留 - 检查是否误改了传入的引用参数:
function foo(&$arr)里$arr[] = ...会改变原始数组,影响后续调用 - 避免在递归函数里读写
$_SESSION、$_POST或未声明的全局变量;真要用,加global $x;并注释清楚
递归返回值出问题,很少是语法错误,多数是某一层没把值“托上去”,或者根本没走到该托的地方——盯住每一层的 return 和参数变化,比看最终结果更管用。



















