- 在编译器基础类中添加了对引用参数默认值的支持检查 - 当检测到引用参数具有默认值时抛出致命错误 - 添加了深度递归测试文件以验证递归函数功能 - 测试包含阶乘、斐波那契、相互递归和树形递归等场景 - 验证了分治算法如快速排序的递归实现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