You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python二分查找函数isIn匹配特定字符返回False的问题排查

排查二分查找字符存在性函数的问题

嘿,我瞅了下你写的isIn函数,问题出在递归分支的处理上,咱们一步步捋:

核心问题分析

你写的else块里有两个return语句,但第二个return永远不会被执行——因为第一个return已经把函数结果返回了。而且你把判断字符和中间位置字符大小关系的代码给注释掉了,导致不管目标字符是比中间字符大还是小,程序只会递归搜索字符串的左半部分,那如果目标字符在右半部分(比如你测试的"s"就在"frostbite"的右半段),自然找不到啦!

修复后的代码

咱们把注释的判断逻辑恢复,并且调整递归分支的处理:

def isIn(char, aStr):
    '''
    char: a single character
    aStr: an alphabetized string
    returns: True if char is in aStr; False otherwise
    '''
    if aStr == "":
        return False
    # 处理长度为1的情况,简化成一行更清晰
    if len(aStr) == 1:
        return aStr == char
    
    mid_idx = len(aStr) // 2
    mid_char = aStr[mid_idx]
    
    if mid_char == char:
        return True
    elif char < mid_char:
        # 目标字符更小,递归左半部分
        return isIn(char, aStr[:mid_idx])
    else:
        # 目标字符更大,递归右半部分(跳过已检查的中间字符)
        return isIn(char, aStr[mid_idx+1:])

# 测试你的例子
print(isIn("s", "frostbite"))  # 现在会返回True
print(isIn("i", "frostbite"))  # 返回True
print(isIn("e", "frostbite"))  # 返回True

额外优化点

  • 把长度为1的判断简化成一行,代码更简洁
  • 单独定义mid_idx和mid_char变量,提升代码可读性
  • 递归右半部分时从mid_idx+1开始,避免重复检查已经判断过的中间字符(不影响结果,但能减少不必要的递归步骤)

内容的提问来源于stack exchange,提问作者code_conundrum

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:28:59