Concordo con pgaur e rickerbh, la complessità del fibonacci ricorsivo è O (2 ^ n).
Sono giunto alla stessa conclusione con un ragionamento piuttosto semplicistico, ma credo che sia ancora valido il ragionamento.
Innanzitutto, si tratta di capire quante volte la funzione fibonacci ricorsiva (F () da ora in poi) viene chiamata quando si calcola l'ennesimo numero di fibonacci. Se viene chiamato una volta per numero nella sequenza da 0 a n, allora abbiamo O (n), se viene chiamato n volte per ogni numero, allora otteniamo O (n * n) o O (n ^ 2), e così via.
Quindi, quando F () viene chiamato per un numero n, il numero di volte in cui F () viene chiamato per un dato numero tra 0 e n-1 aumenta man mano che ci avviciniamo a 0.
Come prima impressione, mi sembra che se la mettiamo in modo visivo, disegnando un'unità per volta in cui F () viene chiamato per un dato numero, bagniamo una sorta di forma piramidale (cioè se centriamo le unità in orizzontale ). Qualcosa come questo:
n *
n-1 **
n-2 ****
...
2 ***********
1 ******************
0 ***************************
Ora, la domanda è: quanto velocemente si allarga la base di questa piramide man mano che n cresce?
Prendiamo un caso reale, ad esempio F (6)
F(6) * <-- only once
F(5) * <-- only once too
F(4) **
F(3) ****
F(2) ********
F(1) **************** <-- 16
F(0) ******************************** <-- 32
Vediamo che F (0) viene chiamato 32 volte, che è 2 ^ 5, che per questo caso di esempio è 2 ^ (n-1).
Ora, vogliamo sapere quante volte viene chiamato F (x), e possiamo vedere il numero di volte che viene chiamato F (0) è solo una parte di ciò.
Se spostiamo mentalmente tutte le * da F (6) a F (2) linee in F (1), vediamo che le linee F (1) e F (0) sono ora uguali in lunghezza. Ciò significa che viene chiamato il totale dei tempi F () quando n = 6 è 2x32 = 64 = 2 ^ 6.
Ora, in termini di complessità:
O( F(6) ) = O(2^6)
O( F(n) ) = O(2^n)