php 引用实现递归
在 PHP 中,引用(Reference)可以用于实现递归操作,尤其是在处理嵌套数据结构或需要共享状态的场景。以下是几种常见的使用引用实现递归的方法:
使用引用传递参数
通过将参数声明为引用(&),递归调用时可以修改同一变量而非创建副本。例如计算斐波那契数列:
function fibonacci(&$cache, $n) {
if ($n <= 1) return $n;
if (!isset($cache[$n])) {
$cache[$n] = fibonacci($cache, $n - 1) + fibonacci($cache, $n - 2);
}
return $cache[$n];
}
$cache = [];
echo fibonacci($cache, 10); // 输出55
递归修改数组
引用可用于直接修改嵌套数组的元素。以下示例递归地将数组所有值转为大写:
function arrayToUpper(&$array) {
foreach ($array as &$value) {
if (is_array($value)) {
arrayToUpper($value);
} else {
$value = strtoupper($value);
}
}
}
$data = ['a', ['b', 'c']];
arrayToUpper($data);
print_r($data); // 输出['A', ['B', 'C']]
引用实现链表递归
引用可用于构建或遍历递归结构如链表:
class Node {
public $data;
public &$next;
}
function traverse(&$node) {
if ($node !== null) {
echo $node->data . " ";
traverse($node->next);
}
}
$head = new Node();
$head->data = 1;
$second = new Node();
$second->data = 2;
$head->next = &$second;
traverse($head); // 输出1 2
注意事项
- 避免循环引用导致内存泄漏,尤其在长期运行脚本中。
- 引用递归可能增加代码复杂度,需确保有明确的终止条件。
- 对象默认通过引用传递,无需显式使用
&符号。
通过合理使用引用,可以高效实现递归操作,但需注意维护代码的可读性和避免潜在问题。







