Se definiamo che l'ordine di sommatoria in g + fun (h-1) + fun (n-4) è da sinistra a rigth, questo è un problema ben definito. Con che ottengo i valori per il divertimento (n), n = 1, ..., 15: valore
3, 6, 10, 15, 33, 74, 154, 295, 575, 1143, 2269, 4414, 8508, 16396, 31634
ritorno di divertimento (n) viene valutato come sequenza di sommatorie con elementi non-discendenti. Ogni summomm è per uno più grande del precedente (return g ++;) o uguale al precedente (restituisce g + fun() + fun()). La sequenza di esecuzione delle istruzioni di ritorno dipende solo dal parametro di input fun(). Quindi, con g impostato sul valore iniziale! = 0 otteniamo gli stessi summms come con g = 0, ma ogni summand è più grande per lo stesso valore iniziale. Con questo, il divertimento (n) con g iniziale> 0 si valore che è g * numero di istruzioni return eseguite di dimensioni superiori con g iniziale = 0.
definire una (n) come numero di istruzioni eseguite ritorno tornare durante l'esecuzione di fun (n) e G (n) numero di dichiarazioni di reso eseguite in se la clausola (uguale al numero di esecuzioni di istruzioni g ++). Per A e G tiene:
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
Da queste osservazioni si può vedere che per n> 0 vale:
fun(n) = fun(n-1) + G(n-1) * A(n-4) + fun(n-4)
implementazione di Python Semplice:
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: per l'espressione g + fun (h-1) + fun (h-4) non possiamo avere garanzia di valutazione, specialmente non in C.
Dove è definito n? –
@ Michael penso che @aristotaly si riferisca a quella cosa di Big O notation-a-ma-jig. –
non è stato rimosso il tag dei compiti come tutti gli pseudo tag (inutili da soli per classificare una domanda)? – kriss