Ich stimme pgaur und rickerbh zu, die Komplexität von Rekursiv-Fibonacci ist O(2^n).
Ich bin mit einer ziemlich simplen, aber meiner Meinung nach immer noch gültigen Argumentation zu demselben Schluss gekommen.
Zunächst geht es darum, herauszufinden, wie oft die rekursive Fibonacci-Funktion (von nun an F()) bei der Berechnung der N-ten Fibonacci-Zahl aufgerufen wird. Wenn sie einmal pro Zahl in der Folge 0 bis n aufgerufen wird, dann haben wir O(n), wenn sie n-mal für jede Zahl aufgerufen wird, dann haben wir O(n*n) oder O(n^2), und so weiter.
Wenn also F() für eine Zahl n aufgerufen wird, nimmt die Anzahl der Aufrufe von F() für eine bestimmte Zahl zwischen 0 und n-1 zu, je mehr man sich 0 nähert.
Auf den ersten Blick scheint es mir, dass, wenn wir es visuell ausdrücken und jedes Mal, wenn F() für eine bestimmte Zahl aufgerufen wird, eine Einheit zeichnen, eine Art Pyramidenform entsteht (d.h. wenn wir die Einheiten horizontal zentrieren). Etwas wie dies:
n *
n-1 **
n-2 ****
...
2 ***********
1 ******************
0 ***************************
Die Frage ist nun, wie schnell sich die Basis dieser Pyramide vergrößert, wenn n wächst.
Nehmen wir einen realen Fall, zum Beispiel F(6)
F(6) * <-- only once
F(5) * <-- only once too
F(4) **
F(3) ****
F(2) ********
F(1) **************** <-- 16
F(0) ******************************** <-- 32
Wir sehen, dass F(0) 32 Mal aufgerufen wird, was 2^5 entspricht, was für diesen Beispielfall 2^(n-1) ist.
Jetzt wollen wir wissen, wie oft F(x) überhaupt aufgerufen wird, und wir können sehen, dass die Anzahl der Aufrufe von F(0) nur ein Teil davon ist.
Wenn wir gedanklich alle * von den Zeilen F(6) bis F(2) in die Zeile F(1) verschieben, sehen wir, dass die Zeilen F(1) und F(0) jetzt gleich lang sind. Das bedeutet, dass F() insgesamt 2x32=64=2^6 aufgerufen wird, wenn n=6 ist.
Was nun die Komplexität betrifft:
O( F(6) ) = O(2^6)
O( F(n) ) = O(2^n)