Programmation C – Deux pour les boucles à la récursion

J’essayais de créer une fonction récursive qui simulerait deux boucles for. Donc, la fonction devrait faire ceci:

int recursion(int n, int i, int j) { for(i=0; i<n; i++) { for(j=i+1; j<n; j++) { printf("%d %d\n", i, j); } } } 

mais, je veux que ce soit récursif. J’ai essayé quelque chose comme:

 int recursion(int n, int i, int j) { if(i<n) { if(j<n) { printf("%d %d\n", i, j); recursion(n, i+1, j+1); } recursion(n, i+1, i+1+1); } } 

J’appellerais un récursif en main comme

 recursion(10, 0, 1); 

mais la sortie n’est pas la même pour ces deux versions de function. Est-ce que quelqu’un peut me dire où je me trompe avec le récursif?

Pour simuler des boucles for nestedes, vous ne devez incrémenter qu’une de vos variables de compteur pour chaque appel récursif, selon que vous êtes “dans” la boucle interne ou externe. De plus, les appels de boucle externe doivent réinitialiser le compteur de boucle interne à zéro.

 /* i for outer loop, j for inner loop, both going 0 to n-1 */ void recursion(int n, int i, int j) { if (i < n) { if (j < n) { // inner loop when j < n printf("i=%d, j=%d\n",i,j); // inner loop body recursion(n, i, j+1); // increment inner counter only! } else { // when j has reached n... // outer loop, which restarts inner loop recursion(n, i+1, 0); // increment outer counter, reset inner // since we're starting a new inner loop } } } 

Si elle est appelée initialement en tant que recursion(N, 0, 0) elle devrait être à peu près équivalente à:

 for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { printf("i=%d, j=%d\n", i, j); } } 

... sauf qu'il ne prend pas en compte les modifications de i dans la boucle interne (rien ne se produit dans ces exemples, mais si la boucle interne fixe i plus grand que N , la version récursive cassera les deux boucles sans terminer la boucle interne en premier ).

Je ne sais pas si vous pouvez remplacer deux boucles for avec une fonction récursive. Vous pouvez facilement le faire fonctionner avec quelques fonctions récursives.

 void recursion2(int n1, int n2) { if ( n2 >= 0 ) { recursion2(n1, n2-1); // Do whatever you need to do with the variables. func(n1, n2); } } void recursion1(int n1, int n2) { if ( n1 >= 0 ) { recursion1(n1-1, n2); recursion2(n1, n2); } } 

La récursivité de deux boucles for peut être réalisée de la manière suivante:

 void recursion(int n,int i,int j) //void since you return no value { if(i 

Exemple d'entrée: (les arguments sont envoyés par main() fonction main() )

 5 1 1 

Exemple de sortie:

 1 1 1 2 1 3 1 4 2 0 2 1 2 2 2 3 2 4 3 0 3 1 3 2 3 3 3 4 4 0 4 1 4 2 4 3 4 4