php 递归实现
递归的基本概念
递归是一种在函数内部调用自身的技术。在PHP中,递归通常用于解决可以分解为更小同类问题的情况,例如遍历树形结构、计算阶乘等。
递归实现阶乘
阶乘是一个经典的递归示例。n的阶乘(n!)定义为n乘以(n-1)的阶乘,直到1。
function factorial($n) {
if ($n <= 1) {
return 1;
}
return $n * factorial($n - 1);
}
echo factorial(5); // 输出120
递归实现斐波那契数列
斐波那契数列的每一项是前两项之和,递归可以直观地实现这一逻辑。
function fibonacci($n) {
if ($n == 0) {
return 0;
}
if ($n == 1) {
return 1;
}
return fibonacci($n - 1) + fibonacci($n - 2);
}
echo fibonacci(6); // 输出8
递归遍历目录
递归非常适合处理具有层级结构的数据,例如文件目录。
function scanDirectory($dir) {
$files = scandir($dir);
foreach ($files as $file) {
if ($file != '.' && $file != '..') {
$path = $dir . '/' . $file;
if (is_dir($path)) {
scanDirectory($path); // 递归调用
} else {
echo $path . "\n";
}
}
}
}
scanDirectory('/path/to/directory');
递归的注意事项
递归需要明确的终止条件,否则会导致无限循环。递归深度过大可能导致栈溢出,PHP默认递归深度限制为100。
// 检查递归深度限制
echo ini_get('xdebug.max_nesting_level'); // 默认值通常为100
尾递归优化
尾递归是递归的一种特殊形式,可以避免栈溢出问题,但PHP不直接支持尾递归优化。
function tailFactorial($n, $accumulator = 1) {
if ($n <= 1) {
return $accumulator;
}
return tailFactorial($n - 1, $n * $accumulator);
}
echo tailFactorial(5); // 输出120
递归与迭代的选择
递归代码通常更简洁,但性能可能不如迭代。对于复杂问题,递归更直观;对于性能敏感的场景,迭代可能更合适。

// 迭代实现阶乘
function iterativeFactorial($n) {
$result = 1;
for ($i = 2; $i <= $n; $i++) {
$result *= $i;
}
return $result;
}
echo iterativeFactorial(5); // 输出120






