二分查找代码问题求助:输入非1-100数值未正确返回-1
问题排查与修复方案
核心问题分析
你的代码存在两个关键问题,导致目标值超出1-100范围时无法返回预期的-1:
循环结束后无返回逻辑
函数里的else: return -1永远不会触发,因为arr[mid] == target、arr[mid] < target、arr[mid] > target已经覆盖了所有可能的比较结果。当循环因low > high(说明目标不存在)退出时,函数没有返回值,此时index会是None,而None != -1的判断结果为True,所以会错误执行"Found"分支,而非未找到的提示。字符串与数值的类型不匹配
numbers列表存储的是字符串类型([str(i) for i in range(1,101)]),输入的target_number也是字符串,字符串的比较逻辑和数值完全不同。比如"105"和"20"比较时,字符串会按字符逐个对比,因"1" < "2",会错误认为"105" < "20",直接打乱二分查找的逻辑。
修复后的代码
def binary_search(arr, target): low, high = 0, len(arr) - 1 while low <= high: mid = (low + high) // 2 print(f"current range: {low+1}~{high+1}") print(f"current mid: {arr[mid]}") if arr[mid] == target: return mid elif arr[mid] < target: print(f"target {target} is bigger than {arr[mid]}.") low = mid + 1 else: print(f"target {target} is smaller than {arr[mid]}.") high = mid - 1 # 循环结束后确认未找到,返回-1 return -1 # 改为存储整数类型,保证数值比较逻辑正确 numbers = [i for i in range(1, 101)] target_number = input("Enter the number: ") # 处理输入转整数,同时捕获非数字输入的情况 try: target_number = int(target_number) except ValueError: print(f"{target_number} is not a valid number.") exit() index = binary_search(numbers, target_number) if index != -1: print(f"Found {target_number}!") else: print(f"{target_number} not found.")
修复说明
- 移除了无用的
else: return -1分支,在循环结束后统一返回-1,确保未找到目标时能正确返回预期值。 - 将
numbers列表改为存储整数类型,同时把输入的字符串转为整数,保证比较逻辑符合数值大小的预期。 - 增加了输入合法性判断,处理用户输入非数字的异常情况。
- 修正了输入提示的拼写错误(
numbe改为number)。
内容的提问来源于stack exchange,提问作者nekomin
相关产品推荐
相关产品推荐

