Si nous définissons cet ordre de sommation dans g + fun (h-1) + fun (n-4) est de gauche à droite, que c'est un bon problème défini. Avec ce que je reçois des valeurs pour le plaisir (n), n = 1, ..., 15:
3, 6, 10, 15, 33, 74, 154, 295, 575, 1143, 2269, 4414, 8508, 16396, 31634
Valeur de retour de plaisir (n) est évalué comme séquence de sommations avec des éléments non-descendants. Chaque somme est pour un plus grand que le précédent (return g ++;) ou identique au précédent (return g + fun() + fun()). La séquence d'exécution des instructions de retour dépend uniquement du paramètre d'entrée fun(). Donc, avec g mis à la valeur initiale! = 0 nous obtenons les mêmes invocations qu'avec g = 0, mais chaque somme est plus grande pour la même valeur initiale. Avec cela, le plaisir (n) avec g initiale> 0 retournera valeur est g * nombre de déclarations de retour exécutées plus grandes qu'avec initial g = 0.
Définir A (n) que le nombre de déclarations de retour exécutées lors de l'exécution du numéro fun (n) et G (n) de l'instruction return exécutée dans la clause si (identique au nombre d'exécutions d'instructions g ++). A et G détient:
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
A partir de ces observations, on peut voir que pour n> 0 est vérifiée:
fun(n) = fun(n-1) + G(n-1) * A(n-4) + fun(n-4)
implémentation Python simple:
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: pour l'expression g + fun (h-1) + fun (h-4) on ne peut pas avoir de garantie d'ordre d'évaluation, surtout pas en C.
Où est défini n? –
@Michael Je pense que @aristotaly fait référence à cette notation de Big O thing-a-ma-jig. –
n'a pas été retiré de la balise homework comme toutes les balises pseudo (inutiles par elles-mêmes pour classer une question)? – kriss