Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2637 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [C] quelle est la profondeur de recursion maximale ??

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] quelle est la profondeur de recursion maximale ??

n°702467
olib
keep smiling !
Posté le 19-04-2004 à 03:39:23  profilanswer
 


mon programme plante apres environ 70 000 appels recursifs.
 
je me demandais si il y avait une limite sur la profondeur de récursion et si oui, laquelle...
 
merciiiiiii
 

mood
Publicité
Posté le 19-04-2004 à 03:39:23  profilanswer
 

n°702468
LeGreg
Posté le 19-04-2004 à 03:42:22  profilanswer
 

La taille de la pile, la quantité de mémoire disponible.
 
Quelle limite tu atteinds en premier dépends de ton systeme.
 
Sinon si tu programmais en Caml avec de la recursion terminale tu n'aurais pas ce probleme.
 
En regle general en C on essaie de limiter le nombre d'appels récursifs: La programmation itérative a exactement les memes "capacités" que la programmation récursive.
 
LeGreg

n°702497
Ace17
Posté le 19-04-2004 à 09:20:15  profilanswer
 

LeGreg a écrit :

Sinon si tu programmais en Caml avec de la recursion terminale tu n'aurais pas ce probleme.


 
Qu'est-ce que c'est, la récursion terminale?

n°702549
pascal_
Posté le 19-04-2004 à 10:10:46  profilanswer
 

Ace17 a écrit :


 
Qu'est-ce que c'est, la récursion terminale?


 
C'est quand l'appel de la récursion est la dernière instruction de la fonction.
 

Code :
  1. void affTab( int tab[], int i){
  2.   if( i < TAILLE_MAX ){
  3.     printf( "%d\n", tab[i] );
  4.     affTab( tab, i+1 ); // <= terminal
  5.   }
  6. }
  7. int facto( int n ){
  8.   if( n == 0 ){
  9.     return 1;
  10.   }else{
  11.     return n * facto( n-1 ); // <= pas terminal. La dernière opération
  12.                              // à réaliser est la multiplication
  13. }
  14. }


 

n°703406
Ace17
Posté le 20-04-2004 à 08:06:14  profilanswer
 

Ok merci; Et pour mettre en relation avec ce qu'a dis LeGreg, ca veut donc dire qu'on peut libérer la pile au fur et a mesure?

n°703410
Taz
bisounours-codeur
Posté le 20-04-2004 à 08:10:55  profilanswer
 

c'est pas possible. la récursion c'est bien dans une certaine mesure. mais pas ici. (surtout qu'avec 32bits, tu va pas plus loin que 17!)
 
dérécursifie, si tu n'arrives pas à passer ton algorithme en itératif, tu peux toujours ruser en utilisant toi même une pile d'arguments dans le tas.

n°703411
Taz
bisounours-codeur
Posté le 20-04-2004 à 08:13:48  profilanswer
 

sinon pour avoir une telle profondeur, tu fais quoi ? t'es sur d'avoir rien foiré ou tu réinventes ackerman ?

n°707647
christophe​_d13
L'efficacité à tout prix.
Posté le 24-04-2004 à 12:00:19  profilanswer
 

J'ai déjà fait de la dérécursivité pour parcourir l'arborescence d'un réseau local, de disque physique et de la paletisation. Tout ça car il y avait des problèmes avec VC++ et Windows.
Tous les algos sont dérécursivables...


Message édité par christophe_d13 le 24-04-2004 à 12:00:37
n°707655
Taz
bisounours-codeur
Posté le 24-04-2004 à 12:26:45  profilanswer
 

christophe_d13 a écrit :

Tous les algos sont dérécursivables...

c'est quoi alors la solution pour ackerman ?

n°707657
christophe​_d13
L'efficacité à tout prix.
Posté le 24-04-2004 à 12:34:07  profilanswer
 

Posté par JHelp sur un autre forum (developpez.com)

Code :
  1. ack(m, n)
  2. | reponse <- 0
  3. | soit p une pile
  4. | push(p, (m, n))
  5. | Tant-que p n'est pas vide
  6. |  | (m, n) <- pop(p)
  7. |  | Si m=0
  8. |  |  | reponse <- n+1
  9. |  |  | Si p n'est pas vide
  10. |  |  |  | (m, n) <- pop(p)
  11. |  |  |  | push(p, (m, reponse))
  12. |  |  |  | reponse <- n
  13. |  |  | Fin-si
  14. |  | Sinon si n=0
  15. |  |  | push(p, (m-1, 1))
  16. |  | Sinon
  17. |  |  | push(p, (m-1, reponse))
  18. |  |  | push(p, (m, n-1))
  19. |  | Fin-Si
  20. | FinTant-que
  21. | Renvoie reponse
  22. Fin


Ok, le code ne marche pas correctement.
Mais c'est la seule solution quand on ne pas faire de récursivité : Utiliser un stockage de type pile.


Message édité par christophe_d13 le 24-04-2004 à 12:36:42
mood
Publicité
Posté le 24-04-2004 à 12:34:07  profilanswer
 

n°707660
Taz
bisounours-codeur
Posté le 24-04-2004 à 12:39:50  profilanswer
 

oui ben voilà, avec une pile on fait tout, mais c'est la complètement équivalent avec la pile d'appel ...

n°707665
christophe​_d13
L'efficacité à tout prix.
Posté le 24-04-2004 à 12:43:54  profilanswer
 

Taz> Tout à fait, mais dans ce cas, on maîtrise complètement la pile, donc sa taille. C'est pas l'os qui la gêre à notre place. C'était le problème de olib.
70000 appels récursifs... sachant qu'à chaque appel il a un stockage d'un grand nombre de données pas directement liées à l'algo.

n°707667
Taz
bisounours-codeur
Posté le 24-04-2004 à 12:45:00  profilanswer
 

oui, et ça risque quand même de sérieusement poutrer niveau efficacité

n°707669
christophe​_d13
L'efficacité à tout prix.
Posté le 24-04-2004 à 12:48:15  profilanswer
 

Taz> Tout à fait d'accord.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [C] quelle est la profondeur de recursion maximale ??

 

Sujets relatifs
Arbre binaire, trouver la profondeur d une node.recursion, je ne comprend pas cet algo
[défi de la semaine] objectif réutilisation maximaleLargeur maximale
iteration --> recursion aide algo simple[C++ OPENGL] Affichage de cubes superposés et tampon de profondeur
[YACC] Problème de récursion à droite[HTML] tableau de taille maximale pour un forum
[JAVA] comment donner une taille maximale a un textfield?[XML] Récuperer la valeur maximale contenue dans une balise
Plus de sujets relatifs à : [C] quelle est la profondeur de recursion maximale ??


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)