Я не уверен, есть ли «быстрый и грязный» способ, но вы можете использовать старую добрую математику. Никаких причудливых теорем, только простые уравнения.
На k-м уровне рекурсии (k
начинается с нуля) цикл будет иметь ~ n/(2^k) - 2^k
итераций. Следовательно, общее количество итераций цикла будет S = sum(n/2^i) - sum(2^i)
для 0 <= i <= l
, где l
- глубина рекурсии.
l
будет приблизительно log(2, n)/2
(докажите это).
Преобразовав каждую часть в формулу для S
по отдельности, получим.
S = (1 + 2 + .. + 2^l)*n/2^l - (2^(l + 1) - 1) ~= 2*n - 2^(l + 1) ~= 2*n - sqrt(n)
Поскольку каждое другое утверждение, кроме цикла, будет повторяться только l
раз, и мы знаем, что l ~= log(2, n)
, это не повлияет на сложность.
Итак, в итоге получаем O(n)
.