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>0e p>0. Non mostri cosa restituisce la funzione se raggiungiamo le istruzioni if 3 e 4th. Intendevi avere una returndichiarazione 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 returnun'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<=pe d>0e p>0tutto 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.