Caclul de factorielle - C - Programmation
Marsh Posté le 04-12-2008 à 18:39:47
dsl j'avais oublier de mettre le : return facto(x-1)*x;
Merci
Marsh Posté le 04-12-2008 à 19:23:00
En vrac :
- main() est une fonction de type int mais n'a aucun return
- scanf() c'est mal, entre une chaîne de caractère pour le constater. Utilise fgets() + strtol()
- n'oublie pas de faire un petit test pour vérifier que le nombre entré est >=1. Sinon ton programme plantera sur une explosion de la pile (pas de condition d'arrêt à ta récursivité)
- et donc il manque le return à ta fonction si x != 1 (j'ai vu ta réponse, mais à tout hasard met à jour le code dans ton post pour qu'on voit où ça se situe, si tu as toujours le problème bien sûr)
Marsh Posté le 05-12-2008 à 17:54:06
Tu arrives à me donner n! pour n=13 ?
quelques exemples aussi,
http://www.luschny.de/math/factorial/index.html
Marsh Posté le 05-12-2008 à 19:49:28
La méthode avec for :
Code :
|
est elle plus rapide que la méthode récursive ?
Merci
Marsh Posté le 05-12-2008 à 20:03:31
l'itératif est *en général* plus efficace que le récursif (modulo les trace caches ou les compilos sioux)
Marsh Posté le 05-12-2008 à 22:34:45
Joel F a écrit : l'itératif est *en général* plus efficace que le récursif (modulo les trace caches ou les compilos sioux) |
Mon prof d'image processing nous a dit exactement le contraire hier
Il nous a dit qu'en général le récursif est plus rapide mais que par contre t'as intérêt à avoir un ordio avec pas mal de RAM de bonne qualité sinon tu te manges la gueule..
Tu peux développer ta réponse du coup s'il te plait?
Marsh Posté le 05-12-2008 à 22:49:29
En gros, dans la plupart des langages fonctionels par contre, le récursif est en général comparable voir meilleurs que l'itératif -qui pose ne outre d'autre probleme.
Par contre, la récursivité dans les langages impératifs nécessite de sauvegarder le contexte d'appel et de potentiellement allouées enormement de variables locales sur la pile. Chaque coup te coute en outre les 4-5 cycles necessaires à effectuer le saut vers la fonction elle-même.
Sauf que, actuellement, pas mal de processeur on des caches de traces qui mémoisent les séquences d'instructions et les rechargent pas à chaque passage. Dans ce cas, la récursivité a un coup moindre car seul le cout sur la pile coute.
Fut aussi un temps ou certains front-end C tenter de dérécursifier les fonctions récursives à récursivité terminales, mais en je sais pas si ça a abouti.
Autre cas, la fonction qui calcule récursivement plusierus fois la meme valeur (genre fibonnacci et equivalent). Dans ce cas,l'algo récursif nécessite pour etre efficace d'etre réécrit sous forme d'algo de programmation dynamique qui va explicitement effectuer cette memoisation.
Marsh Posté le 06-12-2008 à 08:59:52
Ok merci beaucoup
Marsh Posté le 07-12-2008 à 16:31:53
Joel F a écrit :
|
C'est vraiment propre à l'x86, et son petit nombre de registres. Sur d'autres architectures, il y a des barillets, qui sollicitent beaucoup moins la pile que ne le ferait un programme sous x86.
Citation : Fut aussi un temps ou certains front-end C tenter de dérécursifier les fonctions récursives à récursivité terminales, mais en je sais pas si ça a abouti. |
Largement, les compilateurs aujourd'hui savent optimiser la plupart des tail-calls, exemple avec fact():
sans optimisation:
Code :
|
avec:
Code :
|
Marsh Posté le 07-12-2008 à 17:33:09
Gf4x3443 a écrit : |
Oui bien entendu.
Gf4x3443 a écrit : |
Ah bah voila maintenant je sais
Marsh Posté le 07-12-2008 à 18:34:38
Gf4x3443 a écrit : |
Largement, les compilateurs aujourd'hui savent optimiser la plupart des tail-calls, exemple avec fact():
sans optimisation:
Code :
|
avec:
Code :
|
J'dit p'tet une connerie, mais c'est pas pour les changement de contexte qu'on a invensté les registres virtuels ?
Ce qui fait qu'en realité le nombre de registre a un impact limité sur les perfs vu qu'on en a beaucoup plus en pratique. (meme si y'a des tables de translations et tout ça...)
Sinon THEORIQUEMENT, quelque soit le type de jeux d'instruction, une boucle for va BEAUCOUP plus vite qu'une fonction recursive.
Marsh Posté le 07-12-2008 à 19:00:19
MEI a écrit : |
Principe des fenetres de registre: http://www.sics.se/~psm/sparcstack.html (entre autres).
Un changement de contexte est un cas particulier d'appel de fonction.
Citation : |
Euh si. Le nombre de registre, et la manière dont ils sont utilisés, a un impact sur la performance. Le design de la FPU de l'x86 en est le plus bel exemple foireux.
C'est un compromis: plus il y a de registres, et plus cela en fait à sauvegarder lors d'un changement de contexte (volontaire ou non). Quand ca n'est pas géré électroniquement, c'est couteux (les interruptions hard sur des DSP sont très lourdes pour cette raison).
Marsh Posté le 04-12-2008 à 18:28:50
Bonjour à tous,
Je débute ma formation en langage C et j'essaye de faire un programme me permettant de calculer la factorielle d'un nombre donnée, j'ai écrit le programme suivant :
Or lorsque je rentre un chiffre différent de 1 la factorielle n'est pas calculée...pk et d'où vient mon erreur?
Merci pour vos réponses.
Message édité par Elmoricq le 04-12-2008 à 19:19:54