Je suis d'accord avec pgaur et rickerbh, la complexité de fibonacci-récursif est O (2 ^ n).
Je suis arrivé à la même conclusion par un raisonnement plutôt simpliste mais je crois toujours valable.
Tout d'abord, il s'agit de déterminer combien de fois la fonction fibonacci récursive (F () à partir de maintenant) est appelée lors du calcul du nombre Nth fibonacci. S'il est appelé une fois par nombre dans la séquence 0 à n, alors nous avons O (n), s'il est appelé n fois pour chaque nombre, alors nous obtenons O (n * n), ou O (n ^ 2), etc.
Ainsi, lorsque F () est appelé pour un nombre n, le nombre de fois que F () est appelé pour un nombre donné entre 0 et n-1 augmente à mesure que nous approchons de 0.
Comme première impression, il me semble que si nous le mettons de manière visuelle, en dessinant une unité par temps F () est appelé pour un nombre donné, humide obtenir une sorte de forme pyramidale (c'est-à-dire, si nous centrons les unités horizontalement ). Quelque chose comme ça:
n *
n-1 **
n-2 ****
...
2 ***********
1 ******************
0 ***************************
Maintenant, la question est, à quelle vitesse la base de cette pyramide s'élargit-elle à mesure que n grandit?
Prenons un cas réel, par exemple F (6)
F(6) * <-- only once
F(5) * <-- only once too
F(4) **
F(3) ****
F(2) ********
F(1) **************** <-- 16
F(0) ******************************** <-- 32
Nous voyons que F (0) est appelé 32 fois, ce qui correspond à 2 ^ 5, ce qui correspond à 2 ^ (n-1) pour cet exemple.
Maintenant, nous voulons savoir combien de fois F (x) est appelé, et nous pouvons voir que le nombre de fois que F (0) est appelé n'est qu'une partie de cela.
Si nous déplaçons mentalement tous les * des lignes F (6) à F (2) dans la ligne F (1), nous voyons que les lignes F (1) et F (0) sont maintenant de longueur égale. Ce qui signifie que le nombre total de fois où F () est appelé lorsque n = 6 est 2x32 = 64 = 2 ^ 6.
Maintenant, en termes de complexité:
O( F(6) ) = O(2^6)
O( F(n) ) = O(2^n)