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

时间:2014-01-14 04:37:03

标签: python recursion bisection

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

def isitIn(char, aStr):
   m = aStr[len(aStr) // 2]
   if aStr == '' or len(aStr) == 1 or char == m:
      return False
   else:
      if char < m:
         return isitIn(char, aStr[:-1])
      elif char > m:
         return isitIn(char, aStr[1:])
   return isitIn(char, aStr)

我的解释: 我首先找到字符串的中间字符。如果它等于字符,则返回False。如果它不等于字符,则继续检查字符是否低于中间字符,然后使用递归函数创建堆栈并最终返回布尔值True。现在我使用-1和1索引,因为我不想包含中间字符。

而不是解决方案,我宁愿得到提示,因为我仍然想要弄明白,但是不同的视角永远不会伤害。谢谢!

Error message:
Test: isIn('a', '')
Your output:
Traceback (most recent call last):
File "submission.py", line 10, in isIn
m = aStr[len(aStr) // 2]
IndexError: string index out of range
Correct output:
False

4 个答案:

答案 0 :(得分:5)

该功能永不返回True 。我认为它应该在True时返回char == m,因此您可以将其从if-clause(即返回False)中删除并将其放入另一个if

if char == m:
   return True
elif aStr == '' or len(aStr) == 1:
    return False
else:
    ...

此外,您正在调用未定义的isIn方法。我想你想递归调用isitIn

在比较char < mchar > m后,你应“平分”字符串,所以不要return isitIn(char, aStr[:-1])return isIn(char, aStr[1:]),而是通过(在递归调用中)字符串的“一半”。

if char < m:
    return isitIn(char, aStr[:len(aStr) // 2])
elif char > m:
    return 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)

答案 1 :(得分:5)

总的来说,你的代码看起来很不错。但我会仔细看看你的第一个if语句。特别是,您要检查char是否等于中间字符。如果你的角色等于中间角色,你想要返回什么?

此外,您需要确保算法可以访问所有路径。在什么条件下你的函数会返回True?

答案 2 :(得分:1)

这也有效。也略短:

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)

答案 3 :(得分:0)

我认为这段代码可以正常工作,我只是在检查字符'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)