C++ fonction récursive plante si appelée 32436 fois
Fermé
neo781
Messages postés
2
Date d'inscription
mardi 1 novembre 2016
Statut
Membre
Dernière intervention
2 novembre 2016
-
Modifié par crapoulou le 1/11/2016 à 22:07
Utilisateur anonyme - 3 nov. 2016 à 19:51
Utilisateur anonyme - 3 nov. 2016 à 19:51
A voir également:
- C++ fonction récursive plante si appelée 32436 fois
- Fonction si et - Guide
- Fonction moyenne excel - Guide
- Qu'est ce qu'une femme fait 3 fois par jour et un homme une fois dans sa vie ✓ - Forum Loisirs / Divertissements
- Je suis une chose que les garçons utilisent deux fois par jour et les filles une fois toute leur vie - Forum Loisirs / Divertissements
- Pc qui bip 3 fois démarrage ✓ - Forum BIOS
2 réponses
Utilisateur anonyme
2 nov. 2016 à 20:43
2 nov. 2016 à 20:43
Salut,
Les fonctions récursives ne peuvent aller au délà d'une certaine profondeur pour une histoire de taille de pile (heap size).
Chaque instruction que tu appelles est stockée dans une pile et ensuite les instructions sont traitées. Cependant, les fonctions récursives font appel à elles-même jusqu'à une certaine profondeur. Malheureusement, la pile ne peut stocker indéfiniment les instructions à résoudre. C'est un peu comme un vase que tu remplis trop sans le vider à chaque fois.
Plus d'information : https://franckh.developpez.com/tutoriels/c-ansi/recursivite/
Les fonctions récursives ne peuvent aller au délà d'une certaine profondeur pour une histoire de taille de pile (heap size).
Chaque instruction que tu appelles est stockée dans une pile et ensuite les instructions sont traitées. Cependant, les fonctions récursives font appel à elles-même jusqu'à une certaine profondeur. Malheureusement, la pile ne peut stocker indéfiniment les instructions à résoudre. C'est un peu comme un vase que tu remplis trop sans le vider à chaque fois.
Plus d'information : https://franckh.developpez.com/tutoriels/c-ansi/recursivite/
neo781
Messages postés
2
Date d'inscription
mardi 1 novembre 2016
Statut
Membre
Dernière intervention
2 novembre 2016
2 nov. 2016 à 21:39
2 nov. 2016 à 21:39
Merci Jason.
Du coup j'ai réécrit mon programme en remplaçant la fonction récursive
par une boucle while. Et là ça a marché tout de suite.
Je donne la version de mon sudoku solver avec la boucle while si ça peut intéresser quelqu'un.
Du coup j'ai réécrit mon programme en remplaçant la fonction récursive
par une boucle while. Et là ça a marché tout de suite.
Je donne la version de mon sudoku solver avec la boucle while si ça peut intéresser quelqu'un.
#include <iostream>
#include <cstdio>
using namespace std;
const int avance = 1;
const int recule = 0;
int compteur = 0;
void affiche (int t[9][9]);
bool teste (int t[9][9], int nb, int x, int y);
int remplit (int tab[9][9], int t1 [81]);
bool calcule (int tab [9][9], int t1[81], int c, int nbcat, int val, int av_rec);
bool fin (int tab [9][9], int t1[81], int nbcat);
int main()
{
// facile
//int tab[9][9]= {{0,1,0,0,2,4,0,0,9},{0,3,0,0,0,8,0,0,0},{2,9,4,6,7,3,0,0,8},{0,0,2,0,1,0,9,6,5},{0,0,8,0,4,0,2,0,0},
// {9,7,1,0,6,0,3,0,0},{4,0,0,9,5,2,6,7,1},{0,0,0,7,0,0,0,4,0},{6,0,0,4,8,0,0,9,0}};
//int tab[9][9]= {{0,0,0,0,0,0,0,1,2},{0,0,0,0,0,0,0,0,3},{0,0,2,3,0,0,4,0,0},{0,0,1,8,0,0,0,0,5},{0,6,0,0,7,0,8,0,0},
// {0,0,0,0,0,9,0,0,0},{0,0,8,5,0,0,0,0,0},{9,0,0,0,4,0,5,0,0},{4,7,0,0,0,6,0,0,0}};
//int tab[9][9]= {{0,3,2,0,0,1,0,0,6},{0,0,8,0,2,5,0,3,4},{7,0,0,4,0,0,8,1,0},{0,0,0,2,0,0,1,6,0},{0,0,1,3,0,7,4,0,0},
// {0,7,9,0,0,6,0,0,0},{0,4,3,0,0,2,0,0,8},{8,1,0,6,3,0,5,0,0},{2,0,0,7,0,0,3,4,0}};
// le plus difficile du monde ??
int tab[9][9] = {{1,0,0,0,0,7,0,9,0},{0,3,0,0,2,0,0,0,8},{0,0,9,6,0,0,5,0,0},{0,0,5,3,0,0,9,0,0},{0,1,0,0,8,0,0,0,2},
{6,0,0,0,0,4,0,0,0},{3,0,0,0,0,0,0,1,0},{0,4,0,0,0,0,0,0,7},{0,0,7,0,0,0,3,0,0}};
// difficile
// int tab[9][9] = {{0,1,0,0,0,4,0,9,7},{0,0,7,0,0,0,0,4,8},{0,8,9,0,5,0,2,0,3},{5,0,0,6,0,2,0,0,0},{0,0,0,0,0,0,0,0,0},
// {0,0,0,5,0,3,0,0,8},{1,0,2,0,8,0,6,5,0},{0,6,0,0,0,0,1,0,0},{3,0,0,4,0,0,0,7,0}};
int t81 [81]; int r;
r=remplit (tab,t81);
affiche (tab);
calcule (tab, t81, 0, r, 1, avance);
affiche (tab);
return 0;
}
/************************************************************************************************************************
Teste la valeur nb en x,y dans t
renvoie true si valeur possible, false autrement