Уравнения повторения - просто математика: разверните, суммируйте и упростите.
T(n) = 3T(n-1) + n = 3 (3 T(n - 2) + (n-1)) + n
= 3^2 T(n - 3) + 3^2(n-2) + 3(n-1) + n)
= ...
= 3^i T(n - i) + Σ_(j=0..i-1) 3^j * (n-j)
= Σ_(j=0..n-1) 3^j * (n-j) // assuming T(0) = 0
Теперь мы можем найти различные верхние границы в зависимости от того, насколько мы хотим думать об этом:
T(n) = Σ_(j=0..n-1) 3^j * (n-j)
< n * Σ_(j=0..n-1) 3^j
= n * (3^n - 1)
Итак T(n) = O(n*3^n)
.
Вы также можете получить более жесткий предел, разделив сумму на две части:
T(n) = Σ_(j=0..n-1) 3^j * (n-j)
< n * Σ_(j=0..n-x) 3^j * (n-j) + x * Σ_(j=n-x..n-1) 3^j
= n (3^(n-x+1) - 1) + x * (3^n - 3^(n-x+1))
используя x = log_3(n)
вы получите T(n) = O(3^n * log(n))
.
Вы также можете приблизить сумму Σ(n-i)3^i
с помощью интеграла и получить точную сложность Θ(3^n)
.