В вашей версии 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
Вместо этого правильный ответ просто проверяет, является ли aStr == char
истинным для длины-is-1 случай;Я бы придерживался этого или, по крайней мере, заменил 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
:
if char > middle:
return isIn(char, aStr[:midIndex])
else:
return isIn(char, aStr[midIndex + 1:])