Python检查字符是否在字符串中的函数为何无限循环
问题根因
你的代码存在多处逻辑错误,直接触发无限循环的是循环与递归逻辑的混用问题,其余错误会导致功能完全不符合预期:
- 无限循环直接诱因:循环条件永远成立
你使用了while len(Astr) > 1作为循环入口,但整个循环块内从未修改过Astr变量,只要初始传入的字符串长度大于1,循环判断条件永远为真,自然无法退出。本质上你写的比较逻辑是递归思路,不需要套while循环,纯递归用if判断终止边界即可;如果要用循环实现,每次迭代必须更新查找区间、修改Astr的值或者对应的左右边界指针。 - 中间值比较逻辑完全错误
二分查找每次需要取单个中间位置的字符和目标字符比对,但你用切片Astr[(int(len(Astr)/2)) : -(int(len(Astr)/2))]取的是字符串片段:偶数长度时这个切片是空串,长度大于3的奇数时这个切片是多字符片段。拿单个输入字符和空串、多字符串做相等判断和大小比较,完全不符合二分查找的比对逻辑,根本不可能正确匹配目标字符。 - 递归调用未返回结果
即便移除while循环改为纯递归结构,你在两个分支中只是调用了is_in(),没有用return把递归调用的结果向上层返回,分支执行完后会直接走到函数末尾的返回逻辑,无法拿到正确的判断结果。 - 边界判断缺失
现有逻辑在字符串长度小于等于1时直接返回False,完全没有校验最后剩余的单个字符是否和目标字符相等,哪怕目标字符确实存在,递归切到长度为1的边界时也会返回错误结果。 - 隐含前提缺失
二分查找要求传入的目标序列是有序的,你直接用字符大小比较判断左右区间,需要保证传入的Astr是按字符编码顺序排好序的,否则比对逻辑完全不成立。
修正后的纯递归实现
def is_in(char, Astr): str_len = len(Astr) # 空字符串直接返回不存在 if str_len == 0: return False mid = str_len // 2 mid_char = Astr[mid] # 匹配到中间字符直接返回True if char == mid_char: return True # 切到只剩单个字符仍未匹配,返回False if str_len == 1: return False # 目标字符小于中间字符,递归查找左半段 if char < mid_char: return is_in(char, Astr[:mid]) # 目标字符大于中间字符,递归查找右半段 else: return is_in(char, Astr[mid+1:])
内容的提问来源于stack exchange,提问作者lushyplushy
相关产品推荐
相关产品推荐

