Ecco, qui hai ragione ad avere qualche problema. Questo algoritmo non è proprio un bel punto di partenza perché c'è di mezzo un po' di matematica, ma ok... facciamo almeno qualcosa. Prendiamo questo codice, equivalente al tuo:
Codice:
procedure euclide(a, b) // assumiamo a > b
if (b == 0) return a
else return euclide(b, a mod b)
Vogliamo calcolare il tempo di calcolo nel caso peggiore utilizzando il criterio di costo uniforme. È evidente che il caso peggiore capita quando massimo comun divisore tra i due numeri è 1, ovvero quando a e b sono coprimi. Chiaramente (utilizzando il criterio di costo uniforme) tutte le operazioni fatte in una singola chiamata alla funzione richiedono un tempo costante, chiamiamolo C. Il costo complessivo sarà dato solo dal numero di chiamate ricorsive moltiplicate per questa costante C.
Se volessimo calcolare l'esatto tempo di calcolo, dovremmo risolvere un equazione di questo tipo:
T(a, b) = C + T(b, a mod b) = C + (C + T(a mod b, b mod (a mod b)) = 2C + T(a mod b, b mod (a mod b)) = ... = kC
Visto che capire cos'è questo k non è proprio banale, iniziamo a dimostrare che k <= b.
Dalla definizione del modulo sappiamo che (a mod b) <= b-1. Possiamo quindi dire che nelle successive chiamata alla procedura avremo il secondo parametro che è qualcosa che è al più b-1.
T(a, b) = C + T(b, r1 <= b-1) = C + (C + T(r1, r2 <= r1-1)) = 2C + T(r1, r2 <= r1-1) = ... = kC
Adesso, non sappiamo quanto valga r1,r2,...,rk ma sappiamo che sono tutti valori
strettamente decrescenti. Di conseguenza abbiamo dimostrato che il numero di chiamate (considerando anche la prima) alla funzione euclide sono sicuramente inferiori o uguali a b. Ovvero abbiamo k <= b, che ci porta ad avere T(a, b) = O(bC) = O(b)
Siamo arrivati a dire che il costo di euclide è al massimo lineare sull'input più piccolo, ma abbiamo over-semplificato perché non avevamo una stima migliore per i valori di b. Utilizzando il teorema di Lamé possiamo vedere che non solo è O(b), ma anche ~5*log10(b)
Non so se a ti basta questo o se volevi la dimostrazione seria. Comunque ci può stare che fai fatica a capire i tempi di calcolo di sta roba: la dimostrazione per dire O(b) l'ho fatta sul momento (magari c'è pure qualche errore), ma quella seria non è roba che puoi fare così a caso. Non ci arrivi con l'intuito che c'è una relazione tra i tempi di calcolo dell'algoritmo di Euclide e i numeri di Fibonacci.