IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Stack OverFlow et récursivité


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de Noxalus
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 14
    Par défaut Stack OverFlow et récursivité
    Bonjour à toutes et à tous !

    J'ai réussi il y a peu de temps à coder un algorithme de génération de labyrinthes parfaits. Celui-ci fonctionne très bien, mais comme j'ai utilisé la récursivité, celui-ci arrive rapidement en dépassement de mémoire, et je ne peux pas générer des labyrinthe de plus de 80*80. En effet, la pile d'appel à la fonction devient tellement grand qu'elle dépasse sa capacité maximum.

    J'ai entendu dire qu'il fallait passer en itératif pour résoudre ce problème, mais je ne vois pas du tout comment faire. Faudrait connaître le nombre d'appel à la fonction, non ?

    Je vous met la fonction "principale" qui est appelée à à répétition et qu'il faudrait modifier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
     
            /** Génére un layrnithe parfait **/
            public void GenLabyParfait()
            {
                // On réinitialise le tableau
                for (int i = 0; i < 4; i++)
                {
                    casespossibles[i] = false;
                }
                // On recherche les cases possibles
                casespossibles = RechercheCasesPossibles();
     
                int j = 0;
                for (int i = 0; i < 4; i++)
                {
                    if (casespossibles[i] == false)
                        j++;
                }
                // Si aucune case n'est possible
                if (j == 4)
                {
                    // On regarde qu'on se retrouve pas à la case initiale 
                    // (auquel cas la génération du labyrinthe est finie)
                    if (!(pos_actuelle == sortie_position))
                    {
                        // On retourne à la case précédente
                        pos_actuelle = pos_prec.Pop();
                        // Et on rappelle l'algorithme de génération avec la nouvelle position
                        GenLabyParfait();
                    }
                }
                // Si au moins un case est possible 
                // => on en choisi une au hasard
                else
                {
                    int mur_alea = random.Next(4);
                    while (casespossibles[mur_alea] == false)
                    {
                        mur_alea = random.Next(4);
                    }
     
                    // Haut
                    if (mur_alea == 0)
                    {
                        // On pose un chemin
                        Carte[pos_actuelle.X, pos_actuelle.Y - 1] = 0;
                        // On stocke notre position actuelle
                        pos_prec.Push(pos_actuelle);
                        // On avance sur cette case
                        pos_actuelle.Y--;
                    }
                    // Droite
                    else if (mur_alea == 1)
                    {
                        // On pose un chemin
                        Carte[pos_actuelle.X + 1, pos_actuelle.Y] = 0;
                        // On stocke notre position actuelle
                        pos_prec.Push(pos_actuelle);
                        // On avance sur cette case
                        pos_actuelle.X++;
                    }
                    // Bas
                    else if (mur_alea == 2)
                    {
                        // On pose un chemin
                        Carte[pos_actuelle.X, pos_actuelle.Y + 1] = 0;
                        // On stocke notre position actuelle
                        pos_prec.Push(pos_actuelle);
                        // On avance sur cette case
                        pos_actuelle.Y++;
                    }
                    // Gauche
                    else if (mur_alea == 3)
                    {
                        // On pose un chemin
                        Carte[pos_actuelle.X - 1, pos_actuelle.Y] = 0;
                        // On stocke notre position actuelle
                        pos_prec.Push(pos_actuelle);
                        // On avance sur cette case
                        pos_actuelle.X--;
                    }
                    // Et on rapelle l'algorithme
                    GenLabyParfait();
                }
            }
    Merci d'avance !

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 84
    Par défaut
    La formulation récursive donne de très bon résultats pour des labyrinthes de taille modeste. Dès lors que l'on veut générer de grands labyrinthes (1000 x 1000, par exemple), le programme risque de se terminer brutalement si la taille de la pile est insuffisante. Il est donc important de prévoir une taille de pile suffisante ou à défaut de passer à une autre solution comme l'historique à base de tableau.

    L'exploration exhaustive est moins complexe que la fusion de chemins car elle ne nécessite pas la mise en œuvre de structures complexes.
    Wikipedia

    Essaye de changer ton algo en algo de fusion de chemins (en plus il est meilleur qualitativement car les chemins sont plus aléatoires... mais il est plus dure à mettre en place...)

    Bon courage

  3. #3
    Membre averti Avatar de Noxalus
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 14
    Par défaut
    J'avais déjà lu cet article (qui m'a bien aidé) et l'autre méthode m'avait l'air vraiment difficile à implémenter.

    Par contre, quand ils parlent d'historique à base de tableau, il parle de la sauvegarde de la pile des appels ? Ou bien c'est la méthode de l'autre algo ?

Discussions similaires

  1. Stack Overflow : (FloodFill) récursivité sur tableau de pixels
    Par Xplik dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 27/03/2009, 22h32
  2. Récursivité - Stack Overflow
    Par Forever1213 dans le forum Langage
    Réponses: 2
    Dernier message: 09/03/2008, 10h10
  3. Stack OverFlow
    Par Goundy dans le forum Langage
    Réponses: 2
    Dernier message: 24/12/2005, 21h35
  4. Problème de stack overflow
    Par heider dans le forum Langage
    Réponses: 13
    Dernier message: 22/09/2005, 19h50
  5. Stack overflow
    Par portu dans le forum Langage
    Réponses: 3
    Dernier message: 26/11/2003, 15h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo