Если мы определим, что порядок суммирования в g + fun (h-1) + fun (n-4) слева направо, то это хорошо определенная проблема. При этом я получаю значения для веселья (n), n = 1, ..., 15:
3, 6, 10, 15, 33, 74, 154, 295, 575, 1143, 2269, 4414, 8508, 16396, 31634
Возвращаемое значение fun (n) оценивается как последовательность суммирования с не убывающими элементами. Каждое слагаемое на единицу больше предыдущего (возвращает g ++;) или совпадает с предыдущим (return g + fun () + fun ()). Последовательность выполнения операторов возврата зависит только от входного параметра fun (). Таким образом, с g, установленным в начальное значение! = 0, мы получаем те же слагаемые, что и при g = 0, но каждое слагаемое больше для того же начального значения.
При этом fun (n) с начальным g> 0 вернет значение, которое на g * количество выполненных операторов возврата больше, чем с начальным g = 0.
Определите A (n) как число выполненных операторов возврата при выполнении fun (n) и G (n) число выполненных операторов возврата в , если предложение (то же самое, что и число выполнений операторов g ++). Для A и G выполняется:
A(n) = A(n-1) + A(n-4) + 1
G(n) = G(n-1) + G(n-4)
A(n) = 1 and G(n) = 1, for n <= 0
Из этих наблюдений видно, что при n> 0 выполняется:
fun(n) = fun(n-1) + G(n-1) * A(n-4) + fun(n-4)
Простая реализация Python:
def x( h ):
Rg = { -3:1, -2:1, -1:1, 0:1 }
Ra = { -3:1, -2:1, -1:1, 0:1 }
F = { -3:1, -2:1, -1:1, 0:1 }
for i in xrange( 1, h+1 ):
F[i] = F[i-1] + Rg[i-1]*Ra[i-4] + F[i-4]
print i, F[i]
Rg[i] = Rg[i-1] + Rg[i-4]
Ra[i] = Ra[i-1] + Ra[i-4] + 1
@ stakx: для выражения g + fun (h-1) + fun (h-4) у нас не может быть гарантии порядка оценки, особенно в C.