所以我要在线上一个python类。我想帮助您找出我的代码和正确答案代码之间的差异。我没有注释我的内容,但答案是有注释的,您需要的每件事都应该存在,以弄清楚我要做什么。我最初是独立编写答案的,结果与该类给出的正确答案代码非常相似。但是,我的代码不断返回错误
Traceback (most recent call last):
File "submission.py", line 11, in isIn
middle = aStr[midIndex]
IndexError: string index out of range
这是我的代码
def isIn(char, aStr):
'''
char: a single character
aStr: an alphabetized string
returns: True if char is in aStr; False otherwise
'''
# Your code here
midIndex = len(aStr)//2
middle = aStr[midIndex]
if len(aStr) == 0:
return False
if len(aStr) == 1 or char == middle:
return True
else:
if char > middle:
return isIn(char,aStr[:middle])
else:
return isIn(char,aStr[middle +1:])
这是班上给我的正确答案:
def isIn(char, aStr):
'''
char: a single character
aStr: an alphabetized string
returns: True if char is in aStr; False otherwise
'''
# Base case: If aStr is empty, we did not find the char.
if aStr == '':
return False
# Base case: if aStr is of length 1, just see if the chars are equal
if len(aStr) == 1:
return aStr == char
# Base case: See if the character in the middle of aStr equals the
# test character
midIndex = len(aStr)//2
midChar = aStr[midIndex]
if char == midChar:
# We found the character!
return True
# Recursive case: If the test character is smaller than the middle
# character, recursively search on the first half of aStr
elif char < midChar:
return isIn(char, aStr[:midIndex])
# Otherwise the test character is larger than the middle character,
# so recursively search on the last half of aStr
else:
return isIn(char, aStr[midIndex+1:])
我的代码的 midIndex
是middle_nummber
,我的代码的midChar
只是middle
。
答案 0 :(得分:0)
您的版本有4个错误;两项用于处理极端情况,另外两项用于确定要搜索的一半。
您的代码未正确处理“空字符串”大小写。对于长度为0的字符串,midIndex
将为0
,但aStr[0]
将不存在。
这就是带注释的答案以
开头的原因if aStr == '':
return False
如果输入为空,则找不到搜索到的字符串。您可以测试这种情况,但是为时已晚。这是导致您共享回溯的原因:
>>> aStr = ''
>>> midIndex = len(aStr)//2
>>> midIndex
0
>>> aStr[midIndex]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: string index out of range
接下来,您也正在处理len(aStr) == 1
边缘情况错误。您的测试是:
if len(aStr) == 1 or char == middle:
return True
如果aStr
设置为'z'
,则len(aStr)
为true,而char
设置为什么都没有关系。因此,函数中的aStr = 'z';
char ='a', will produce
True`显然是不正确的:
>>> aStr = 'z'
>>> char = 'a'
>>> middle = 'z'
>>> len(aStr) == 1 or char == middle
True
正确答案只不过是测试{is {1}}是否为length-is-1情况;我会坚持这样做,或者至少将aStr == char
替换为or
:
and
您的下一个错误是搜索了一半内容。您进行了测试:
>>> len(aStr) == 1 and char == middle
False
>>> char = 'z'
>>> len(aStr) == 1 and char == middle
True
因此搜索的字符比中点更大。您要搜索排序后的输入字符串的第二个上半部分。相反,您的版本会在相反的下半部分搜索:
if char > middle:
使用数字而不是字母来更好地说明这一点,输入字符串if char > middle:
return isIn(char,aStr[:middle]) # slicing up to the middle
具有中点'12345'
,因此如果'3'
是char
或'4'
,您想在下半年找到它。
您的第四个也是最后一个错误是在该'5'
表达式中。 aStr[:middle]
是单个字符,而不是整数索引。您要使用middle
:
midIndex