Сложность на самом деле кажется O(2^(n+1))
.Вызовы методов, выполняемые в вашей рекурсивной функции, примут форму сбалансированного двоичного дерева, высота которого n + 1
, для входа n
.
С такой проблемой, как хорошая компьютерная наукаПодход заключается в том, чтобы просто записать количество вызовов методов.Для ввода n = 5
вот как выглядит число вызовов методов:
n=5 -> n=4, n=4 (2 calls)
n=4 -> n=3, n=3 (4 calls)
n=4 -> n=3, n=3
n=3 -> n=2, n=2 (8 calls)
n=3 -> n=2, n=2
n=3 -> n=2, n=2
n=3 -> n=2, n=2
n=2 -> n=1, n=1 (16 calls)
n=2 -> n=1, n=1
n=2 -> n=1, n=1
n=2 -> n=1, n=1
n=2 -> n=1, n=1
n=2 -> n=1, n=1
n=2 -> n=1, n=1
n=2 -> n=1, n=1
n=1 -> (32 calls to n=0, then the recursion ends)
Итак, вызов сгенерированный с n=5
:
1 + 2 + 4 + 8 + 16 + 32 = 63 calls
Это эквивалентно:
2^(5+1) - 1 = 2^(n+1) - 1
Итак, сложность на самом деле O(2^(n+1))
, а не O(n^2)
. Вот ссылка на страницу Википедии, которая также показывает ту же формулу для числа узлов в сбалансированном двоичном дереве.