J'essaie de comprendre comment je peux utiliser la récursivité pour faire de N-Niveau niché pour des boucles.
Par exemple, si n = 3, il y aurait 3 "niveaux" et ainsi de suite. P> Je n'arrive pas à comprendre comment je serais capable de savoir comment je pourrais Pour placer la boucle Si dans la dernière boucle et comment je peux accéder aux variables de la précédente pour les boucles de la déclaration IF. Je sais que la question des boucles imbriquées variables a été posée beaucoup de fois et j'ai examiné tous les deux. Mais personne ne semble m'aider. P> Quelqu'un pourrait-il présenter une manière facile d'utiliser la récursivité pour y parvenir, en gardant à l'esprit que je suis toujours débutant en C ++, pour me diriger dans la bonne direction? P> L'utilisation L'affaire est la suivante: P> Écrivez un programme pour saisir le nombre de dés m. Le programme émettra le nombre total de cas possibles, le nombre de cas possibles pour chaque N et le N avec la probabilité la plus élevée. Remarque: une seule entrée M est lue dans. N est calculé par le programme P>
Exemple Si l'utilisateur entre dans M = 2, le programme devrait émettre P>
Le nombre total de cas possibles est 36.
Les possibilités sont de
2 1
3 2
4 3
.
.
.
12 1 P>
blockQuote> p>
6 Réponses :
comptez simplement la profondeur de chaque fonction de récursion et comptez sur Si vous voulez vraiment que vous puissiez utiliser trois fonctions différentes pour x, y et z. p> p> f code> ..
Eh bien, @lighness. Mon problème est le suivant.
Vous pouvez l'écrire comme ça, mais ... je ne le ferais pas. C'est un code déroutant et ne vous donne aucun avantage. Si vous le souhaitez, votre véritable cas d'utilisation a un grand nombre de boucles imbriquées, envisagez simplement de ne pas le faire, à la place; C'est une odeur de conception sérieuse.
void nested_loop(const int levels, const int comparator, const int level = 0, const int accumulator = 0) { if (level < levels) { for (int i = 0; i < 6; i++) { nested_loop(levels, comparator, level + 1, accumulator + i); } } else { if (accumulator == comparator) { // your if (z+y+x==f) //do something } } } int main() { const int levels = 3; const int f = 42; nested_loop(levels, f); }
La structure de base d'un algorithme récursif avec plusieurs boucles est la suivante: la configuration pour appeler récursivingoops code> du niveau supérieur nécessite deux vecteurs - un pour les index et un pour le nombre d'itérations à chaque niveau. L'exemple ci-dessous définit trois boucles imbriquées, itérant 5, 6 et 9 fois à chaque niveau: P>
vector<int> indexes(3, 0);
vector<int> endPerIndex;
endPerIndex.push_back(5);
endPerIndex.push_back(6);
endPerIndex.push_back(9);
recursiveLoops(indexes, endPerIndex, 0);
Un problème typique des fonctions récursives est le débordement de la pile. Pour un niveau variable imbriqué pour la boucle, cela est très susceptible de se produire. Je sais que notre fournisseur a codé à fond de leurs boucles au niveau maximum de nids de 5 et ils ont dit qu'ils augmenteraient la limitation à 9. Trois ans auparavant, ils n'ont toujours pas fait cela, lol.
Vous êtes très vague sur pourquoi vous voulez cela. Pour un démarreur, une solution possible est de remplacer chaque boucle avec une fonction récursive.
void recursiveX(int zVal, int yVal, int xVal) { if(zVal+yVal+xVal == f)... if(xVal != 0) recursiveX(zVal, yVal, xVal -1); } void recursiveY(int zVal, int yVal) { recursiveX(zVal, yVal, 6); if(yVal != 0) recursiveY(zVal, yVal-1); } void recursiveZ(int val) { recursiveY(val, 6); if(val != 0) recursiveZ(val-1); } ... recursiveZ(6);
Voici un exemple dans l'ancien clair C ++. D'abord, je fais un vecteur des gammes pour chaque dimension appelée Vous pouvez certes rendre cela plus propre. P> Voici: P> maxes code>. Si la somme de tous les indices est 2, j'imprime quelque chose.
Dans l'exemple, je loop z de 0 à 1, y de 0 à 2, x de 0 à 3
values are 0 0 0
values are 1 0 0
values are 2 0 0 did something!
values are 3 0 0
values are 0 1 0
values are 1 1 0 did something!
values are 2 1 0
values are 3 1 0
values are 0 2 0 did something!
values are 1 2 0
values are 2 2 0
values are 3 2 0
values are 0 0 1
values are 1 0 1 did something!
values are 2 0 1
values are 3 0 1
values are 0 1 1 did something!
values are 1 1 1
values are 2 1 1
values are 3 1 1
values are 0 2 1
values are 1 2 1
values are 2 2 1
values are 3 2 1
Je suis tombé à travers cela plus tôt aujourd'hui et j'ai pensé que je pourrais partager la solution que j'ai finalement proposé. Je ne suis pas sûr de ce que la politique est ici en ce qui concerne la réponse à de vieux postes. Je vais juste par le fait que je suis tombé sur cette question ce matin, et ce genre de chose aurait été utile pour moi.
Pour l'efficacité, j'ai évité la récursivité. En outre, il n'utilise aucune chose spécifique C ++ - cela fonctionnera également sur C aussi. P>
Nous essayons de créer N nichés "pour" boucles. Au lieu d'utiliser P>
const int n = /*Insert N here: how many loops do you need?*/; int i[n+1]; // if "n" is not known before hand, then this array will need to be created dynamically. //Note: there is an extra element at the end of the array, in order to keep track of whether to exit the array. for (int a=0; a<n+1; a++) { i[a]=0; } int MAX = 79; //That's just an example, if all of the loops are identical: e.g. "for(int i=0; i<79; i++)". If the value of MAX changes for each loop, then make MAX an array instead: (new) int MAX [n]; MAX[0]=10; MAX[1]=20;...;MAX[n-1]=whatever. int p = 0; //Used to increment all of the indicies correctly, at the end of each loop. while (i[n]==0) {//Remember, you're only using indicies i[0], ..., i[n-1]. The (n+1)th index, i[n], is just to check whether to the nested loop stuff has finished. //DO STUFF HERE. Pretend you're inside your nested for loops. The more usual i,j,k,... have been replaced here with i[0], i[1], ..., i[n-1]. //Now, after you've done your stuff, we need to increment all of the indicies correctly. i[0]++; // p = 0;//Commented out, because it's replaced by a more efficient alternative below. while(i[p]==MAX) {//(or "MAX[p]" if each "for" loop is different. Note that from an English point of view, this is more like "if(i[p]==MAX". (Initially i[0]) If this is true, then i[p] is reset to 0, and i[p+1] is incremented. i[p]=0; i[++p]++; //increase p by 1, and increase the next (p+1)th index if(i[p]!=MAX) p=0;//Alternatively, "p=0" can be inserted above (currently commented-out). This one's more efficient though, since it only resets p when it actually needs to be reset! } }
Le code va bien, mais il semblerait mieux si la plupart des commentaires ont été supprimés.
Bonne idée d'éviter le débordement de la pile
Je n'ai trouvé qu'un cas spécial max = 1 où il semble courir pour toujours.
@Valentas j'ai ajouté 'si (i [n]> 0) pause;' après 'i ++ p] ++;' Pour corriger le bug max = 1. Il semble fonctionner.
Typo dans la deuxième boucle?
Qu'essayez-vous d'atteindre? Pourquoi utiliser la récursion?
Je me demande simplement comment cela peut être atteint avec la récursion.
Ce que vjovic a dit. Ce n'est pas clair ce que vous essayez de faire. Ensemble de cela dans les appels de fonction récursive quelque peu semble goalless. Nous devons en voir plus sur la façon dont vous aimeriez avoir l'air de regarder. "avec récursion" est trop vague. En outre, il n'y a pas une telle chose qu'une "boucle si"
Je comprends que cela peut être atteint itérativement. Mais j'aimerais savoir comment cela peut atteindre de manière récursive.
@cortex: Pouvez-vous expliquer ce qu'il s'agit de nos commentaires que vous ne comprenez pas? Ma réponse devra être une conjecture, car vous refusez de fournir tout contexte ou détail, à la place de répéter les mêmes mots encore et encore. C'est vraiment i> frustrant.
Pardon. Je vais éditer le poteau en conséquence.
Cela n'explique toujours pas pourquoi vous pensez avoir besoin de récursion ou de quelle manière / dans quelle mesure vous souhaitez que la boucle soit réformée de manière récursive.
Je n'ai pas besoin de récursives pour résoudre ce problème. Je voudrais essayer une méthode différente de résolution du problème et de demander de l'aide à la communauté.