使用递归二分法查找字符串中字符,Python代码运行结果不符预期求指导
问题排查与代码修正
核心问题1:递归分支缺少返回值
代码中elif y<x[midindex]和else两个分支仅执行了递归调用,没有将调用结果返回。Python函数无显式return语句时默认返回None,会导致即使子查询命中目标字符,上层函数也无法拿到正确的布尔结果,最终输出不符合预期。
核心问题2:未满足二分法的使用前提
二分查找的逻辑成立的基础是待查询序列已经过排序,如果直接使用未排序的用户输入字符串执行查找,会出现目标字符实际存在却返回不存在的错误结果。
修正后代码示例
# 获取输入 origin_str = input('请输入待查询字符串\n') target_char = input('请输入要搜索的单个字符\n') # 输入合法性校验 if len(target_char) != 1: print("错误:请输入单个待查询字符") exit() # 先对字符串排序,满足二分查找前提 sorted_str = sorted(origin_str) def binary_search(char_list, target): list_len = len(char_list) # 边界条件:空列表直接返回不存在 if list_len == 0: return False # 边界条件:单元素直接比对 if list_len == 1: return char_list[0] == target # 计算中间下标 mid_index = list_len // 2 # 中间元素命中直接返回 if char_list[mid_index] == target: return True # 目标小于中间元素,递归查询左半部分并返回结果 elif target < char_list[mid_index]: return binary_search(char_list[:mid_index], target) # 目标大于中间元素,递归查询右半部分并返回结果 else: return binary_search(char_list[mid_index+1:], target) print(binary_search(sorted_str, target_char))
改动说明
- 所有递归调用前增加
return关键字,将子查询结果向上层传递 - 新增输入合法性校验,避免用户输入多个待查询字符导致逻辑异常
- 先对输入字符串做排序处理,保证二分查找逻辑生效
- 将全局变量
y改为函数入参传递,代码可复用性更强,符合函数封装规范 - 将
int(len(x)/2)替换为Python整数除法运算符//,写法更简洁规范
内容的提问来源于stack exchange,提问作者Syed Ali Ahmed Islam
相关产品推荐
相关产品推荐

