Это в основном весь смысл идентификатора. :) Идентификаторы специфичны, их можно использовать только один раз на странице. Классы могут использоваться как довольные.
Я рекомендую упростить вашу логику и стиль, чтобы было проще рассуждать о вашем коде. Вы постоянно вычисляете N//2
, что тратит впустую циклы, и это шумно и семантически бессмысленно. Сохраните работу в переменную с именем mid
в начале вашей функции, придав ей смысл. Добавьте интервал в свой код, чтобы уменьшить визуальный шум и сделать его приятным (и возможным) для пошагового выполнения.
Что касается start
, end
и N
, это дополнительная переменная, о которой нужно думать и манипулировать - start
и end
достаточно для обработки всех случаев, и путаница в этих переменных кажется быть проблемой в вашем коде.
Поскольку вы уже знаете алгоритм, вы близки к решению. Однако четность массива не является проблемой - единственная проблема - это (буквально!) Крайние случаи, когда mid == 0
и mid == len(nums) - 1
. В обоих этих случаях есть только один сосед, поэтому мы бы потерпели крах, если бы попытались nums[mid-1]
и nums[mid+1]
соответственно. Решение этих проблем - это проверка того, что mid
не находится ни на одном конце массива, ни на другом, прежде чем пытаться проводить эти сравнения.
Собрав все вместе, все, что должно произойти в функции, это:
def finder(start, end):
mid = (start + end) // 2
if mid > 0 and nums[mid] < nums[mid-1]:
return finder(start, mid - 1)
elif mid < end and nums[mid] < nums[mid+1]:
return finder(mid + 1, end)
else:
return mid