Python 使用递归对分算法检查字符是否在字符串中

Python 使用递归对分算法检查字符是否在字符串中,python,recursion,bisection,Python,Recursion,Bisection,我目前正在edx学习编程课程,我的说明如下: 使用二分法搜索的思想,编写一个递归算法,只要字符串按字母顺序排列,就可以检查字符串中是否包含字符。 我的代码(python 2.7)如下: 函数为从不返回真值。我认为当char==m时,它应该返回True,因此您可以从if子句中删除它(即返回False),并将其放入另一个if: if char == m: return True elif aStr == '' or len(aStr) == 1: return False else:

我目前正在edx学习编程课程,我的说明如下: 使用二分法搜索的思想,编写一个递归算法,只要字符串按字母顺序排列,就可以检查字符串中是否包含字符。 我的代码(python 2.7)如下:


函数为从不返回
真值
。我认为当
char==m
时,它应该返回
True
,因此您可以从
if子句中删除它(即返回
False
),并将其放入另一个
if

if char == m:
   return True
elif aStr == '' or len(aStr) == 1:
    return False
else:
    ...
另外,您正在调用未定义的
isIn
方法。我想您想递归调用
isitIn

在比较
char
char>m
之后,您应该对字符串进行“对分”,因此不要执行
返回isitIn(char,aStr[:-1])
返回isIn(char,aStr[1:])
,而是(在递归调用中)传递字符串的“一半”

if char < m:
    return isitIn(char, aStr[:len(aStr) // 2])
elif char > m:
    return isitIn(char, aStr[len(aStr) // 2:])
如果字符m:
返回isitIn(char,aStr[len(aStr)//2:]
编辑:以防万一,我尝试的代码是:

def isitIn(char, aStr):
    if aStr == '':  # Check for empty string
        return False
    m = aStr[len(aStr) // 2]
    if char == m:
       return True
    elif len(aStr) == 1:
        return False
    else:
       if char < m:
           return isitIn(char, aStr[:len(aStr) // 2])
       elif char > m:
           return isitIn(char, aStr[len(aStr) // 2:])
    return isitIn(char, aStr)
def isitIn(char,aStr):
如果aStr='':#检查是否有空字符串
返回错误
m=aStr[len(aStr)//2]
如果char==m:
返回真值
elif len(aStr)==1:
返回错误
其他:
如果字符m:
返回isitIn(char,aStr[len(aStr)//2:]
返回isitIn(字符、aStr)

总体而言,您的代码看起来相当不错。但我会仔细看看你的第一个if声明。特别是,您要检查字符是否等于中间字符。如果您的角色等于中间角色,您希望返回什么


此外,您需要确保算法可以到达所有路径。在什么条件下,函数将返回True

我认为这段代码可以正常工作,只是我在检查字符“m”之前对字符串进行了排序:

def isitIn(char, aStr):
b = ''
if aStr == '':  # Check for empty string
    return False
b = sorted(aStr)
m = b[len(b) // 2]
if char == m:
   return True
elif len(b) == 1:
    return False
elif char < m:
       return isitIn(char, b[:len(b) // 2])
else:
       return isitIn(char, b[len(b) // 2:])
return isitIn(char, aStr)
def isitIn(char,aStr):
b=“”
如果aStr='':#检查是否有空字符串
返回错误
b=已排序(应力应变率)
m=b[len(b)//2]
如果char==m:
返回真值
elif len(b)==1:
返回错误
elif char
这同样有效。也稍微短一点:

def isIn(char, aStr):
    if len(aStr)==0:
        return False
    elif len(aStr)==1:
        return char == aStr
    elif char == aStr[len(aStr)//2]:
        return True
    else:
        if char < aStr[len(aStr)//2]:
            return isIn(char, aStr[0:len(aStr)//2])
        elif char > aStr[len(aStr)//2]:
            return isIn(char, aStr[len(aStr)//2:]) 
    return isIn(char, aStr)
def isIn(字符、应用程序代码):
如果len(aStr)==0:
返回错误
elif len(aStr)==1:
return char==aStr
elif char==aStr[len(aStr)//2]:
返回真值
其他:
如果charaStr[len(aStr)//2]:
返回isIn(char,aStr[len(aStr)//2:]
返回isIn(字符、应用程序代码)

感谢您的洞察力。我真不敢相信我错过了。一个简单的视角改变能做什么真是令人惊讶。再次感谢。谢谢你的评论。当我运行代码时,我注意到一个奇怪的问题。它现在为字符串“abcd”中的字符b、c、d返回True,但不是a。此外,我想确保这实际上是一个递归,因为检查程序说它不是进行递归调用。您可以通过在函数的最开始处放置
print
语句来测试它。如果您看到超过1个“输出”,则表示您的方法正在被递归调用。@user3171116:您是否碰巧将
char==m
的检查放在
aStr==''或len(aStr)==1
之后?因为在这种情况下,对于偶数长度的字符串,它将无法找到第一个字符。(如果你不明白为什么,试着在一个文件中运行你的代码,或者添加打印语句来显示它的进度。)但是如果你按照Christian的顺序去做,它应该会起作用。哇,你们太棒了。我必须说,难怪堆栈溢出被称为“通用调试工具”。这就是“a”的问题所在。这是一个多么好的工具啊。谢谢大家!
def isitIn(char, aStr):
b = ''
if aStr == '':  # Check for empty string
    return False
b = sorted(aStr)
m = b[len(b) // 2]
if char == m:
   return True
elif len(b) == 1:
    return False
elif char < m:
       return isitIn(char, b[:len(b) // 2])
else:
       return isitIn(char, b[len(b) // 2:])
return isitIn(char, aStr)
def isIn(char, aStr):
    if len(aStr)==0:
        return False
    elif len(aStr)==1:
        return char == aStr
    elif char == aStr[len(aStr)//2]:
        return True
    else:
        if char < aStr[len(aStr)//2]:
            return isIn(char, aStr[0:len(aStr)//2])
        elif char > aStr[len(aStr)//2]:
            return isIn(char, aStr[len(aStr)//2:]) 
    return isIn(char, aStr)