Ich stimme pgaur und rickerbh zu, die Komplexität von rekursivem Fibonacci ist O (2 ^ n).
Ich bin durch eine eher vereinfachte, aber meiner Meinung nach immer noch gültige Argumentation zu dem gleichen Schluss gekommen.
Zunächst geht es darum herauszufinden, wie oft die rekursive Fibonacci-Funktion (F () von nun an) bei der Berechnung der N-ten Fibonacci-Zahl aufgerufen wird. Wenn es einmal pro Nummer in der Folge 0 bis n aufgerufen wird, dann haben wir O (n), wenn es für jede Nummer n-mal aufgerufen wird, erhalten wir O (n * n) oder O (n ^ 2), und so weiter.
Wenn also F () für eine Zahl n aufgerufen wird, wächst die Häufigkeit, mit der F () für eine gegebene Zahl zwischen 0 und n-1 aufgerufen wird, wenn wir uns 0 nähern.
Als ersten Eindruck scheint es mir, dass, wenn wir es visuell formulieren, das Zeichnen einer Einheit pro Mal, wenn F () für eine bestimmte Zahl aufgerufen wird, nass eine Art Pyramidenform erhält (dh wenn wir Einheiten horizontal zentrieren) ). Etwas wie das:
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 ist, was für diesen Beispielfall 2 ^ (n-1) ist.
Nun wollen wir wissen, wie oft F (x) überhaupt aufgerufen wird, und wir können sehen, wie oft F (0) aufgerufen wird, ist nur ein Teil davon.
Wenn wir mental alle * von F (6) nach F (2) in die Linie F (1) verschieben, sehen wir, dass die Linien F (1) und F (0) jetzt gleich lang sind. Das heißt, die Gesamtzeit, zu der F () aufgerufen wird, wenn n = 6 2x32 = 64 = 2 ^ 6 ist.
Nun zur Komplexität:
O( F(6) ) = O(2^6)
O( F(n) ) = O(2^n)