我目前正在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
答案 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 < m
和char > 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)