Exercice : Un premier résultat
Voici le code récursif établi :
1
void echange(int *n, int *j) {
2
int temp= *n; *n=*j;
3
*j=temp;
4
}
5
void proc0(int ttab[10], int n, int t) {
6
/* n et t désignent l'intervalle représentant le sous tableau à traiter, bornes comprises */
7
int i, j;
8
if (n==t) {
9
/* Nous avons un sous tableau de taille 1, la permutation est complétée, on l'affiche */
10
for (i=0 ; i<=t ; ++i) printf("%d ",ttab[i]);
11
printf("\n");
12
}
13
else
14
for(j=n; j<=t; ++j) {
15
echange(&ttab[n], &ttab[j]);
16
proc(ttab, n+1, t);
17
}
18
}
void echange(int *n, int *j) { int temp= *n; *n=*j; *j=temp; } void proc0(int ttab[10], int n, int t) { /* n et t désignent l'intervalle représentant le sous tableau à traiter, bornes comprises */ int i, j; if (n==t) { /* Nous avons un sous tableau de taille 1, la permutation est complétée, on l'affiche */ for (i=0 ; i<=t ; ++i) printf("%d ",ttab[i]); printf("\n"); } else for(j=n; j<=t; ++j) { echange(&ttab[n], &ttab[j]); proc(ttab, n+1, t); } }
Complétez le résultat obtenu :
Le résultat n'est pas celui souhaité !
En C, un paramètre tableau comme ci-dessus est transmis par valeur. Mais c'est l'adresse du tableau, et non le tableau complet, qui est transmise.
Ainsi, le passage du tableau est fait par référence.
La 3e permutation montre bien que la permutation entre le 1er élément et le 2e n'a pas amené 2 en 1ère position, mais 3 issu de la permutation précédente.