Sono bloccato analizzando la complessità temporale del seguente 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)
La chiamata root sarà fun (0, 0, n, n)
ed n
è la dimensione del problema.
Immagino che: la relazione di ricorrenza sia , che equivale a , e quindi .
La mia analisi è corretta (so che non è molto completa ed esatta)? Se presenta un difetto grave, segnalalo o mostrami una prova corretta e completa sulla complessità temporale di questo algoritmo.
d>0
e p>0
. Non mostri cosa restituisce la funzione se raggiungiamo le istruzioni if 3 e 4th. Intendevi avere una return
dichiarazione dopo ogni invocazione ricorsiva di fun
? (intendevi fun (r, k + 1, d - 1, p)
essere return fun (r, k + 1, d - 1, p)
?) O intendevi avere return
un'affermazione alla fine del corpo della funzione? Modifica il tuo pseudocodice per chiarire e assicurarti di mostrare ciò che restituisce in tutti i casi possibili.
d<=p
e d>0
e p>0
tutto tenga. Cosa dovrebbe succedere? L'algoritmo esegue 2 invocazioni ricorsive alla funzione? O invoca ricorsivamente fun(r, k + 1, d - 1, p)
e poi immediatamente ritorna, senza invocare ricorsivamente fun(r, k - 1, d, p - 1)
? Se prendo il tuo pseudocodice alla lettera, sembra che compia 2 invocazioni ricorsive e poi ritorni con un valore di ritorno indefinito, ma questo sembra strano e mi chiedo se ci sia un errore di battitura / bug nello pseudocodice.