La suite de Fibonacci en C - C - Programmation
Marsh Posté le 25-10-2006 à 16:54:47
Bah t'écris une boucle qui pour chaque itération utilise les résultats des itérations précédentes.
Au passage, ca doit craquer l'exemple chez google.
Marsh Posté le 25-10-2006 à 17:01:17
je sait que ça doit craquer mais j'essaye de trouver seul, donc avec des pistes uniquement.
Marsh Posté le 25-10-2006 à 17:09:34
Euuuh la première erreur, c'est que la suite de Fibonacci renvoie 0 si on lui donne 0, pas 1.
Sinon, ben commences par créer une fonction récursive qui réplique exactement la définition de l'algo.
Marsh Posté le 25-10-2006 à 18:38:08
ReplyMarsh Posté le 25-10-2006 à 18:44:21
ReplyMarsh Posté le 25-10-2006 à 21:21:22
rafalfa2000 a écrit : je sait que ça doit craquer mais j'essaye de trouver seul, donc avec des pistes uniquement. |
Si tu sèches déjà sur cet algo de base, je crains pour la suite. D'ailleurs c'est plus un topic "algo" que "C"...
Tu définis un tableau "int u[3]={1, 1, 0}"
Tu fais une itération de 1 à n
A chaque boucle, tu recalcules "u[2]" en fonction de "u[0]" et "u[1]" puis tu copies "u[1]" dans "u[0]" puis "u[2]" dans "u[1]" comme ça les valeurs sont prêtes pour recalculer "u[2]" au tour de boucle suivant.
En fin de boucle, tu affiches "u[2]"...
masklinn a écrit : Sinon, ben commences par créer une fonction récursive qui réplique exactement la définition de l'algo. |
Utiliser la récursivité sur Fibonacci, c'est aller droit dans le mur. Essaye de calculer "fib(26)" en récursif...
Marsh Posté le 25-10-2006 à 22:33:16
Sve@r a écrit : Utiliser la récursivité sur Fibonacci, c'est aller droit dans le mur. |
J'ai parlé de commencer comme ça, sans vouloir être méchant au stade où il en est c'est largement suffisant d'utiliser la définition canonique
Sve@r a écrit : Essaye de calculer "fib(26)" en récursif... |
Code :
|
Math> fibbase 26 |
C'est un peu trop facile en fait, alors je vais plutôt te donner une implé récursive qui sort du fibo(5000) ok?
Code :
|
Implé:
Code :
|
Marsh Posté le 25-10-2006 à 22:55:55
karlkox a écrit : stack overflow spotted |
Pipeau ahead, captain.
$ ./fib 48
fib 48 -> 4807526976
En C, récursif et super lent.
Marsh Posté le 25-10-2006 à 23:43:32
Je n'ai pas parlé de cet exemple en particulier, un stack overflow n'arrive pas pour une boucle si petite et cela dépend aussi du langage utilisé et de la ram libre disponible.
Marsh Posté le 26-10-2006 à 00:56:38
Primo, ce n'est pas une boucle puisque c'est récursif. Secundo, qu'essayes tu donc de dire? Je rappelle que nous sommes dans la section 'C' du forum et qu'il y a fort peu de chance qu'un tel overflow arrive, même dans une implementation particulierement déficiente, avant que d'exploser la limite généralement constatée des 32bits par int; cf le code du post initial.
Code :
|
Marsh Posté le 26-10-2006 à 17:06:05
masklinn a écrit :
|
Arrête de te la raconter. Evidemment si tu utilises un langage que je ne connais pas mais qui semble adapté maths, tu arriveras à calculer fib(5000) mais tu sais parfaitement qu'on est en C. Et une fonction récursive C pour calculer Fibonacci arrivera péniblement à fib(26) et mettra 2 fois plus de temps pour calculer fib(28) car il lui faudra calculer 2 fois fib(26). Et encore 2 fois plus de temps pour fib(30) etc. Ou alors on crée une fonction récursive intelligente qui détecte les valeurs déjà calculées pour ne pas les recalculer à chaque fois. Mais là, on sort du TP de base...
masklinn a écrit : J'ai parlé de commencer comme ça, sans vouloir être méchant au stade où il en est c'est largement suffisant d'utiliser la définition canonique |
Chacun voit midi à sa porte. Moi je conseille de toujours tenter d'éviter la récursivité autant que possible car elle peut paraître alléchante mais on n'imagine pas le boulot de l'ordi par derrière... Et là, c'est franchement facile de ne pas faire du récursif...
Marsh Posté le 26-10-2006 à 17:19:49
Sve@r a écrit : Arrête de te la raconter. |
WTF
J'ai juste prouvé que tu avais tord, rien de plus
Sve@r a écrit : Evidemment si tu utilises un langage que je ne connais pas mais qui semble adapté maths |
Ce n'est pas le cas, on peut faire la même chose en C, mais j'avais (et j'ai toujours) autre chose à faire que l'implémenter en C.
Le langage est Haskell, sa notation est très proches des mathématiques mais il n'a pas une implémentation spécialement dédiée aux maths (en dehors du fait qu'il est fonctionnel), contrairement à, disons, un Matlab
Sve@r a écrit : Et une fonction récursive C pour calculer Fibonacci arrivera péniblement à fib(26) et mettra 2 fois plus de temps pour calculer fib(28) car il lui faudra calculer 2 fois fib(26). Et encore 2 fois plus de temps pour fib(30) etc. |
C'est très exactement ce que fait la première implémentation
C'est d'ailleurs la raison pour laquelle tu n'as pas vu de fib(5000) avec la première version
Sve@r a écrit : Ou alors on crée une fonction récursive intelligente qui détecte les valeurs déjà calculées pour ne pas les recalculer à chaque fois. Mais là, on sort du TP de base... |
On memoize quoi.
Sve@r a écrit : Chacun voit midi à sa porte. Moi je conseille de toujours tenter d'éviter la récursivité autant que possible car elle peut paraître alléchante mais on n'imagine pas le boulot de l'ordi par derrière... Et là, c'est franchement facile de ne pas faire du récursif... |
Je sais pas si t'as remarqué, mais là le monsieur a déjà des problèmes avec l'IO, donc les optimisations du genre "implémente la fib en itératif plutôt qu'en récursif" j'pense que ça peut être vu après si tu veux, qu'il commence par l'implé canonique et par la suite il pourra en utiliser d'autres.
Marsh Posté le 26-10-2006 à 21:07:44
alors c'est bien beau tout ça mais moi en cour, j'en suis au boucle et au base de focntion.
D'ailleur, je doit faire cette exos a base de for(instruction;conditions;instruction);
Marsh Posté le 27-10-2006 à 15:01:26
Trap D a écrit : Ben c'est la méthode de Sve@r alors. |
Ce n'est pas la "mienne", c'est celle de la "logique". Juste une petite erreur dans la méthode en question: la boucle doit démarrer à 2 et non à 0...
rafalfa2000 a écrit : alors c'est bien beau tout ça mais moi en cour, j'en suis au boucle et au base de focntion. |
La méthode que j'ai expliquée hier. Si t'as pas appris les tableaux, alors la même sans ces derniers...
Tu définis 3 unsigned int a, b et c (unsigned long c'est même encore mieux).
Tu initialises "a" et "b" à 1 car ce sont les 2 premiers termes de la suite
Tu fais une itération de 2 à n (départ à 2 car les valeurs U0 et U1 sont déjà présentes dans "a" et "b" )
A chaque boucle, tu recalcules "c" en fonction de "a" et "b" puis tu copies "b" dans "a" puis "c" dans "b" comme ça les valeurs sont prêtes pour recalculer "c" au tour de boucle suivant.
En fin de boucle, tu affiches "c"...
Marsh Posté le 25-10-2006 à 16:52:37
Bonjour,
Je bloque sur un exos de TP, je vais vous l'exposer:
Ecrire un programme qui affiche le nième terme de la suite de Fibonacci, définie par la relation de récurence:
U(0) = U(1) = 1
Pout tout n >= 2 , Un = U(n -1) + U(n -2)
Bon alors évidement, tout le monde ce doute que j'ai le début :
Et la le noir totale, plus rien!
DOnc si on pouvais me filer un coup de pouce! Merci !