Пусть T(n)
является сложность вычисления oc(n)
. Поскольку для вычисления oc(n)
вы работаете цикл от n-1
к 1
и рекурсивно вызывая oc(i)
, следовательно
T(n)=T(n-1)+T(n-2)+...+T(1) (*).
Если вместо Т (п-1) положим
T(n-1)=T(n-2)+T(n-3)+...+T(1)
в (*)
мы получим:
T(n)=2*(T(n-2)+...+T(1))
Если мы будем продолжать ту же итерацию для T(n-2)
, T(n-3)
и т.д. мы будем заключать tô следующее равенство:
T(n)=2*(T(n-2)+...+T(1))
=4*(T(n-3)+...+T(1))
=2^i*(T(n-i-1)+...+T(1))
=2^n*T(1)/2=O(2^n).
Причина этой сложности - ваш алгоритм вычисления же много раз. Если вы запоминаете значения в массиве, для которых вы рассчитали значение функции oc, и добавьте проверку в первую часть функции, которая вернет значение непосредственно из массива (в случае, если оно уже рассчитано), вместо того, чтобы запускать цикл и снова делать то же самое задание, сложность алгоритма будет резко изменяться и будет O(n)
, так как алгоритм будет вычислять все значения и сохранять при первой итерации ваших циклов.
(Это _procedure_. Чтобы быть _algorithm_, должна быть проблема, которую решает процедура.) – greybeard