二分查找递归实现核心是每次缩小一半搜索范围,php 8.1 需注意类型声明、空数组处理及严格类型一致性;函数接收升序整数数组、目标值及左右边界,返回索引或null,使用intdiv防溢出,终止条件为left>right。

二分查找的递归实现,核心是每次将搜索范围缩小一半,通过比较中间元素与目标值决定向左或右子区间继续递归。PHP 8.1 中需注意类型声明、空数组边界处理及严格类型一致性。
函数签名与类型声明
PHP 8.1 支持联合类型和可为空类型,推荐明确标注参数和返回值类型,提升健壮性:
- 参数
$arr是已升序排列的整数数组(array<int></int>) - 参数
$target是待查找的整数(int) - 返回值为查找到的索引(
int)或null(未找到) - 内部递归需传入左右边界(
int),避免数组切片带来的额外内存开销
递归逻辑与终止条件
递归函数不操作新数组,仅通过下标控制范围。关键点:
- 当
$left > $right时,区间无效,返回null - 计算中点用
$mid = $left + intdiv($right - $left, 2),防止整数溢出(比intdiv($left + $right, 2)更安全) - 若
$arr[$mid] === $target,直接返回$mid - 若
$target ,递归搜索左半区:<code>binarySearchRecursive($arr, $target, $left, $mid - 1) - 否则递归搜索右半区:
binarySearchRecursive($arr, $target, $mid + 1, $right)
完整可运行代码(PHP 8.1+)
php
function binarySearchRecursive(array $arr, int $target, int $left = 0, int $right = null): ?int {
if ($right === null) {
$right = count($arr) - 1;
}
if ($left > $right) {
return null;
}
$mid = $left + intdiv($right - $left, 2);
if ($arr[$mid] === $target) {
return $mid;
} elseif ($target
return binarySearchRecursive($arr, $target, $left, $mid - 1);
} else {
return binarySearchRecursive($arr, $target, $mid + 1, $right);
}
}
// 示例用法:
$nums = [1, 3, 5, 7, 9, 11];
var_dump(binarySearchRecursive($nums, 7)); // int(3)
var_dump(binarySearchRecursive($nums, 4)); // NULL
?>
注意事项与常见陷阱
在 PHP 8.1 下尤其要注意:
- 数组必须严格升序,否则结果不可靠;不校验排序是调用方责任
- 使用
===而非==比较,避免类型隐式转换导致误判(如字符串 "5" 和整数 5) - 递归深度受 PHP
xdebug.max_nesting_level或memory_limit限制,超大数组建议改用迭代版本 - 空数组传入时,
count($arr) - 1为 -1,$left(0) > $right(-1)立即返回null,逻辑自然覆盖
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











