Recursivite

dida87 Messages postés 8 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 6 janvier 2011 - 28 mars 2010 à 22:31
dida87 Messages postés 8 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 6 janvier 2011 - 18 avril 2010 à 13:51
bonjour,ya t'il qlq 'un qui pourrait m'expliquer le deroulement de ce programme recursive seulement la recursivite car j'ai un prb avec elle :
void combinaisons(int *ens,int *cmb,int n,int p,int i,int j){
if(i<p){int k;
for(k=j;k<n;++k){cmb[i]=ens[k];
combinaison(ens,cmb,n,p,i+1,k);}
else{afficher(combinaison,p);}}
int main(){int ens[]={1,5,6,7,8};
int combi[4];
combinaison(ens,combi,5,4,0,0);}
merci

4 réponses

tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
29 mars 2010 à 11:14
Bonjour,
il manque une accolade et tu écris combinaison avec et sans s. Est-ce la même fonction ?
Utilise les balises, c'est mieux pour te lire.
Si j'ai bien compris, afficher() sera appelé à chaque fin de la boucle du premier bloc, et combi[] contiendra progressivement toutes les valeurs de ens[] un peu comme un compteur de vitesse :

ens[0], ens[0], ens[0], ens[0],
ens[0], ens[0], ens[0], ens[1],
...
ens[0], ens[0], ens[1], ens[0],
ens[0], ens[0], ens[1], ens[1],
...
ens[5], ens[5], ens[5], ens[5],

combi[] est rempli avec que des 8 (dernière valeur de ens[]) avant d'appeller afficher(combinaison,p).
Là, combinaison, c'est quoi ? Ce doit plutôt être afficher(cmb, p)

void combinaisons(int *ens,int *cmb,int n,int p,int i,int j)
{ 
  if(i<p) {
    int k; 
    for(k=j;k<n;++k) {
      cmb[i]=ens[k]; 
      combinaison(ens,cmb,n,p,i+1,k);
    } 
  } // MANQUE DANS TON CODE
  else {
    afficher(combinaison,p);
  }
} 
int main(){
  int ens[]={1,5,6,7,8}; 
  int combi[4]; 
  combinaison(ens,combi,5,4,0,0);
} 
0
dida87 Messages postés 8 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 6 janvier 2011
29 mars 2010 à 22:27
bonjour,je me suis tromper dsl ,le voici le code mais j'ai pas compris le deroulement de la fct recursive:

#include <stdio.h>
#include <stdlib.h>




void afficher(int *p,int n){
int i;

for(i=0;i<n;++i)
printf("%d",p[i]);
printf("\n");

}
void combinaisons(int *ens, int *combinaison, int n, int p, int i, int j) {
if (i<p) {
int k;

for (k=j; k<n; k++) {

combinaison[i] = ens[k];

combinaisons(ens,combinaison,n,p,i+1,k);

}
}
else {
afficher(combinaison,p);
}
}








int main()
{
int ens[] = {5,9,3,4};
int combi[2];

combinaisons(ens,combi,4,2,0,0);


return 0;
}
merci,
est ce qu'il ya une fct recursive qui permet de generer toutes les combinaisons entres plusieurs tableau??en C
merci pr l'aide
0
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
31 mars 2010 à 08:41
Pour comprendre la récursion, reproduit la à la main, ligne par ligne, et essaie d'en voir le systèmatisme.
Un peu comme une suite Un = f(Un-1). Il faut un porte de sortie (convergence de la suite) sinon, ça tourne indéfiniment.

Dans ton cas la récursion est produite par l'appel
combinaisons(ens,combinaison,n,p,i+1,k); 

qui augmente i, et la sortie de la récursion se fait sur afficher() quand i>=p
Soit alors :
if (i<p) { 
  ...
  combinaisons(ens,combinaison,n,p,i+1,k);
  ...
} 
else { 
  afficher(combinaison,p); 
} 


Après afficher(), le programme revient après l'appel à combinaisons().

Maintenant, regarde la boucle :

k=0
    cmb[0]=ens[0]; 
      combinaison(ens,cmb,n,p,1,0);

rappel :
cmb[1]=ens[0]; 
      combinaison(ens,cmb,n,p,2,0);

etc... jusqu'à p-1 : afficher().
cmb[p-1]=ens[0]; 
      combinaison(ens,cmb,n,p,p,0);// provoque afficher()


A ce moment, tous les cmb[] contiennent ens[0].
et première sortie de combinaison() : i = p-1 et on passe à k=k+1 (donc 1)
cmb[p-1]=ens[1]; 
      combinaison(ens,cmb,n,p,p,0);

tous les cmb[] contiennent ens[0], sauf le dernier qui contient ens[1].
etc...

Ta dernière question est différente. Je ne sais pas s'il y en a déjà, alors il faut la faire ou la trouver (google !)
0
dida87 Messages postés 8 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 6 janvier 2011
18 avril 2010 à 13:51
Bonjour,je voulais mettres toutes les combinaisons que j'ai trouver dans une strucure (liste ) en c ,pour faire ensuite combinaisons entre ces listes ,si vous avez une idee ,vraiment c'est urgent,Merci
0
Rejoignez-nous