Estou paralisado ao analisar a complexidade de tempo do seguinte algoritmo:
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)
A chamada raiz será fun (0, 0, n, n)
e n
é do tamanho do problema.
Eu acho que: A relação de recorrência é , que é equivalente a , e então .
Minha análise está correta (sei que não é muito completa e exata)? Se houver uma falha grave, aponte-a ou mostre-me uma prova correta e completa da complexidade de tempo desse algoritmo.
d>0
e p>0
. Você não mostra o que a função retorna se atingirmos as 3a e quarta instruções if. Você queria ter uma return
declaração após cada chamada recursiva de fun
? (você queria fun (r, k + 1, d - 1, p)
ser return fun (r, k + 1, d - 1, p)
?) Ou queria ter uma return
declaração no final do corpo da função? Edite seu pseudocódigo para esclarecer e verifique o que isso retorna em todos os casos possíveis.
d<=p
e d>0
e p>0
todos os espera. O que deveria acontecer? O algoritmo faz 2 invocações recursivas para a função? Ou invoca recursivamente fun(r, k + 1, d - 1, p)
e retorna imediatamente, sem invocar recursivamente fun(r, k - 1, d, p - 1)
? Se eu pegar seu pseudocódigo literalmente, parece que ele faz duas invocações recursivas e retorna com um valor de retorno indefinido - mas isso parece estranho e me faz pensar se há um erro de digitação / erro no pseudocódigo.