- 在编译器基础类中添加了对引用参数默认值的支持检查 - 当检测到引用参数具有默认值时抛出致命错误 - 添加了深度递归测试文件以验证递归函数功能 - 测试包含阶乘、斐波那契、相互递归和树形递归等场景 - 验证了分治算法如快速排序的递归实现pull/1/head
parent
ced53b63be
commit
3eaca2c359
2 changed files with 140 additions and 0 deletions
@ -0,0 +1,137 @@ |
||||
--TEST-- |
||||
Deep Recursion Test |
||||
--FILE-- |
||||
<?php |
||||
|
||||
// Test deep recursion with factorial |
||||
function factorial(int $n): int { |
||||
if ($n <= 1) { |
||||
return 1; |
||||
} |
||||
return $n * factorial($n - 1); |
||||
} |
||||
|
||||
// Test fibonacci with memoization |
||||
function fib(int $n, array &$memo): int { |
||||
if ($n <= 1) { |
||||
return 1; |
||||
} |
||||
|
||||
if (isset($memo[$n])) { |
||||
return $memo[$n]; |
||||
} |
||||
|
||||
$result = fib($n - 1, $memo) + fib($n - 2, $memo); |
||||
$memo[$n] = $result; |
||||
return $result; |
||||
} |
||||
|
||||
// Test mutual recursion |
||||
function isEven(int $n): bool { |
||||
if ($n === 0) { |
||||
return true; |
||||
} |
||||
return isOdd($n - 1); |
||||
} |
||||
|
||||
function isOdd(int $n): bool { |
||||
if ($n === 0) { |
||||
return false; |
||||
} |
||||
return isEven($n - 1); |
||||
} |
||||
|
||||
// Test tree recursion |
||||
function sumTree(array $tree): int { |
||||
$sum = $tree['value']; |
||||
|
||||
foreach ($tree['children'] ?? [] as $child) { |
||||
$sum += sumTree($child); |
||||
} |
||||
|
||||
return $sum; |
||||
} |
||||
|
||||
// Test quicksort (divide and conquer) |
||||
function quicksort(array $arr): array { |
||||
if (count($arr) <= 1) { |
||||
return $arr; |
||||
} |
||||
|
||||
$pivot = $arr[0]; |
||||
$left = []; |
||||
$right = []; |
||||
|
||||
for ($i = 1; $i < count($arr); $i++) { |
||||
if ($arr[$i] < $pivot) { |
||||
$left[] = $arr[$i]; |
||||
} else { |
||||
$right[] = $arr[$i]; |
||||
} |
||||
} |
||||
|
||||
return array_merge(quicksort($left), [$pivot], quicksort($right)); |
||||
} |
||||
|
||||
function main() { |
||||
var_dump(factorial(5)); |
||||
var_dump(factorial(10)); |
||||
|
||||
$memo = []; |
||||
var_dump(fib(10, $memo)); |
||||
var_dump(fib(15, $memo)); |
||||
|
||||
var_dump(isEven(10)); |
||||
var_dump(isOdd(10)); |
||||
var_dump(isEven(7)); |
||||
var_dump(isOdd(7)); |
||||
|
||||
$tree = [ |
||||
'value' => 1, |
||||
'children' => [ |
||||
[ |
||||
'value' => 2, |
||||
'children' => [ |
||||
['value' => 4, 'children' => []], |
||||
['value' => 5, 'children' => []], |
||||
], |
||||
], |
||||
[ |
||||
'value' => 3, |
||||
'children' => [ |
||||
['value' => 6, 'children' => []], |
||||
], |
||||
], |
||||
], |
||||
]; |
||||
|
||||
var_dump(sumTree($tree)); |
||||
|
||||
$unsorted = [3, 6, 1, 5, 2, 4]; |
||||
var_dump(quicksort($unsorted)); |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
int(120) |
||||
int(3628800) |
||||
int(89) |
||||
int(987) |
||||
bool(true) |
||||
bool(false) |
||||
bool(false) |
||||
bool(true) |
||||
int(21) |
||||
array(6) { |
||||
[0]=> |
||||
int(1) |
||||
[1]=> |
||||
int(2) |
||||
[2]=> |
||||
int(3) |
||||
[3]=> |
||||
int(4) |
||||
[4]=> |
||||
int(5) |
||||
[5]=> |
||||
int(6) |
||||
} |
||||
Loading…
Reference in new issue