Salut
Je vx savoir quelle est la relation entre les piles et la récursivité ?
Et si vous pouvez me donner un exemple sur la fonction factoriel et les piles
Salut
Je vx savoir quelle est la relation entre les piles et la récursivité ?
Et si vous pouvez me donner un exemple sur la fonction factoriel et les piles
la récursivité se faisant sur la pile, sa limite est celle de la pile. D'autant plus si on a beaucoup de variables prises sur la pile..
Donc une fonction récursive à 30 paramètres appelées quelques milliers (10 aines de ??) de fois provoquera un crash...
La relation est donc d'être bien conscient de cette limite...
La récursivité utilise la mémoire automatique pour empiler les retours de fonctions, les paramètres et les résultats intermédiaires. C'est une manière, certes, 'élégante' de programmer, mais qui a des défauts :
- La taille de la mémoire automatique est limitée.
- Il n'y a pas de moyen standard de modifier ni même de connaitre la limite.
- En cas de débordement le comportement est indéfini.
- Il n'y a pas de moyen standard de savoir si on a atteint la limite.
merci mais je vx un exemple
on fais cette instruction en fonction
int fact(int n)
si on appel la fonction dans le main :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 { if (n==0) return 1; else return n*fact(n-1); }quel sont les étape executer dans la pile ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part fact(4);
C'est une récursivité non-terminale.
Les étapes ici sont (sur une machine avec une pile, comme un Intel x86 ou un M68k) :
--dans le main:
empiler 4
empiler l'adresse de retour
--dans fact:
comparer 4 à 0
calculer 4-1 = 3
empiler 3
empiler l'adresse de retour
---
comparer 3 à 0
calculer 2-1 = 2
empiler 2
empiler l'adresse de retour
---
comparer 2 à 0
calculer 2-1 = 1
empiler 1
empiler l'adresse de retour
---
comparer 1 à 0
calculer 1-1 = 0
empiler 0
empiler l'adresse de retour
---
comparer 0 à 0
retourner 1
dépiler l'adresse de retour
---
calculer 2*1
retourner 2
dépiler l'adresse de retour
---
calculer 3*2
retourner 6
dépiler l'adresse de retour
---
calculer 4*6
retourner 24
dépiler l'adresse de retour
--dans le main:
suite...
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Avant d'avoir un soucis avec la pile, tu auras un soucis avec le calcul de la factoriel en elle même.
On a : n!>=2^n.
Sur beaucoup de systèmes (ce n'est pas toujours le cas, attention), la taille d'un int est de 4 octets = 32 bits. Ce qui ne permet pas de représenter un entier plus grand que 2^33, donc tu ne peux pas calculer 33! (et encore, j'ai pris une énorme marge avec n!>2^n).
Donc si tu te limites aux valeurs où la factoriel est effectivement calculable, il n'y aura, normalement, pas de problème avec la pile... Mais l'algorithme étant tellement simple sans appel récursif, pourquoi s'en priver.
yous18 : Ta fonction plante si on fait fact(-1)![]()
Tu sais, quatre octets ça fait 32 bits, pas 64...
PS: La factorielle dépasse la puissance de 2 à partir de n=4.
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Partager