2013-12-04 4 views

ответ

2

Предполагая, что базовый случай некоторая конечная константа, она должна работать в O(2^n), так как для каждого вызова, он запускает два рекурсивных вызовов.

Например, если базовый случай t(1) = constant

t(1) = t(0) * t(0) = constant * constant 

t(2) = t(1) * t(1) 
    t(1) = t(0) * t(0) = constant * constant 
    t(1) = t(0) * t(0) = constant * constant 

t(3) = t(2) * t(2) 
    t(2) = t(1) * t(1) 
    t(1) = t(0) * t(0) = constant * constant 
    t(1) = t(0) * t(0) = constant * constant 
    t(2) = t(1) * t(1) 
    t(1) = t(0) * t(0) = constant * constant 
    t(1) = t(0) * t(0) = constant * constant 

Это может, однако, быть уменьшена до O(n) за счет кэширования значения (не предполагая побочных эффектов)

t(1) = t(0) * t(0) = constant * constant 

t(2) = t(1) * t(1) 
    t(1) = t(0) * t(0) = constant * constant 
    t(1) evaluated in constant time cache lookup 

t(3) = t(2) * t(2) 
    t(2) = t(1) * t(1) 
    t(1) = t(0) * t(0) = constant * constant 
    t(1) evaluated in constant time cache lookup 
    t(2) evaluated in constant time cache lookup 
+0

thanks.is есть другое решение, решая это уравнение: t (n) = t (n-1)^2 – user123

+0

Само уравнение не является «разрешимым», это скорее рекуррентное отношение. Определение верхней границы в основном определяется тем, что для произвольного n t (n-1) вызывается дважды и в каждом вызове t (n-1) t (n-2) называется дважды [t (n-2)) называется 4 раза] и t (n-3) и т. д. – arcyqwerty

+0

Если вы ищете доказательство, вы можете, вероятно, вывести его, используя доказательство по индукции, но поскольку его довольно просто, вам нужно будет рассуждать, что если каждый бросок t (n) приводит к 2 вызовам t (n-1), тогда будут вызовы O (2^n) для t – arcyqwerty

Смежные вопросы