Vous comparez l'élément de tableau après celui que vous venez calculé. Le tableau n'est pas initialisé, le comportement n'est pas défini.
Vous pouvez corriger votre code de cette façon:
int main() {
int n, p[100];
scanf("%d", &n);
int i = 0;
do {
p[i] = fibo(i);
i++;
} while (p[i-1] <= n);
printf("%d %d", p[i-2], p[i-1]);
return 0;
}
Cependant votre code a plusieurs petits problèmes:
- Vous ne vérifie pas si
scanf()
réussi.
- Vous ne vérifie pas le débordement de tampon potentiel lors de l'enregistrement des valeurs au tableau
p
.
- Vous avez un comportement non défini pour les petites valeurs de
n
que vous allez lire les entrées de p
à des décalages négatifs.
Voici une version corrigée qui aborde ces questions:
#include <stdio.h>
int fibo(int);
int main(void) {
int n, p[100];
if (scanf("%d", &n) == 1) {
for (int i = 0; i < 100; i++) {
p[i] = fibo(i);
if (p[i] > n)
break;
}
if (i >= 2) {
printf("%d %d\n", p[i - 2], p[i - 1]);
}
}
return 0;
}
int fibo(int i) {
if (i == 0) {
return 0;
} else
if (i == 1) {
return 1;
} else {
return (fibo(i - 1) + fibo(i - 2));
}
}
Notez cependant que la séquence de Fibonacci diverge rapidement et dépassement arithmétique peut se produire, ce qui provoque un comportement non défini, produisant un résultat incorrect pour les grandes valeurs de n
.
Voici une solution simple qui ne pas utiliser la récursivité et n'a pas ce problème:
#include <stdio.h>
int main(void) {
int n, a = 0, b = 1;
if (scanf("%d", &n) == 1 && n > 1) {
while (a < n - b) {
int c = a + b; /* no overflow possible */
a = b;
b = c;
}
printf("%d %d\n", a, b);
}
return 0;
}
'i ++; } while (p [i] <= n); 'l'index de tableau est déjà incrémenté lorsque vous vérifiez la dernière valeur. (De même pour 'printf ("% d% d ", p [i-1], p [i]); – wildplasser