Функция считает, сколько раз число n можно разделить пополам нацело, пока не останется 1. Определите время её выполнения в зависимости от n.
Пример
halvings(20) → 4: 20 → 10 → 5 → 2 → 1.
Функция считает, сколько раз число n можно разделить пополам нацело, пока не останется 1. Определите время её выполнения в зависимости от n.
halvings(20) → 4: 20 → 10 → 5 → 2 → 1.
def halvings(n: int) -> int:
if n <= 1:
return 0
return 1 + halvings(n // 2)Ответ: O(log n)
Каждый рекурсивный вызов уменьшает n вдвое, а работа внутри вызова постоянная. От n до 1 получается примерно log₂ n шагов — как у бинарного поиска из главы 1. При n = 1 000 000 будет всего около 20 вызовов, и столько же кадров окажется в стеке вызовов на пике.
Каждый вызов делает постоянный объём работы. Значит, всё решает количество вызовов.
Посчитайте вызовы для n = 8, 16, 32. Как растёт их число при удвоении n?