Je suis bloqué par l'analyse de la complexité temporelle de l'algorithme suivant:
def fun (r, k, d, p):
if d > p:
return r
if d = 0 and p = 0:
r <- r + k
return r
if d > 0:
fun (r, k + 1, d - 1, p)
if p > 0:
fun (r, k - 1, d, p - 1)
L'appel racine sera fun (0, 0, n, n)
, et n
est de la taille du problème.
Je suppose que: La relation de récurrence est , ce qui équivaut à , et donc .
Mon analyse est-elle correcte (je sais qu'elle n'est pas très complète et exacte)? S'il présente un défaut grave, veuillez le signaler ou me montrer une preuve correcte et complète de la complexité temporelle de cet algorithme.
d>0
et p>0
. Vous ne montrez pas ce que la fonction retourne si nous atteignons les 3e et 4e instructions if. Vouliez-vous avoir une return
déclaration après chaque invocation récursive de fun
? (vouliez-vous l' fun (r, k + 1, d - 1, p)
être return fun (r, k + 1, d - 1, p)
?) Ou vouliez-vous avoir une return
déclaration à la toute fin du corps de la fonction? Veuillez modifier votre pseudocode pour clarifier et assurez-vous de montrer ce que cela renvoie dans tous les cas possibles.
d<=p
et d>0
et p>0
tous tiennent. Que doit-il arriver? L'algorithme effectue-t-il 2 invocations récursives à la fonction? Ou invoque-t-elle récursivement fun(r, k + 1, d - 1, p)
puis revient-elle immédiatement, sans invoquer récursivement fun(r, k - 1, d, p - 1)
? Si je prends votre pseudocode littéralement, il semble qu'il effectue 2 invocations récursives puis retourne avec une valeur de retour non définie - mais cela semble étrange et me fait me demander s'il y a une faute de frappe / bogue dans le pseudocode.