|
|
|
|
Bonjour tout le monde
je suis étudiante , je veux écrire un programme en lagage c qui effectue des traitements sur les arbres binaires, mais j'ai eu beaucoup de difficuletés a programmer un truc pareil car les algorithmes utilisées dans le traitement de ce genre de problémes reposent sur le principe de récursivité. et bien mon probléme c la récursivité, j'arrive pas à la comprendre en plus je trouve pas assez d'inforamtions sur ça . donc svp si quelqu'un posséde des informations ,où sait où je peux trouver des solutions à mon probleme qu(il n'ésite pas a me contacter.
Merci.
La récursivité ressemble au raisonnement par récurrence que tu as du voir en math. Sauf que dans le raisonnement par récurrence on va de n à n+1 en partant d'un rang (par exemple 0). La récursivité c'est là même chose mais dans l'autre sens. Le rang 0, où l'on s'arrête correspond à ce qu'on appelle le cas d'arrêt.
// méthode itérative :
unsigned int fact(unsigned int x){
unsigned int i,res = 1;
for(i=1;i<x;++i){
res *= i; // ou si tu préfères res= res * i;
}
}
// methode recursive : cas d'arrêt 0 ou 1:
unsigned int fact_rec(unsigned int x,unsigned int res){
if ( x == 0 || x == 1 ) return 1;
return fact_rec(x-1,res*x);
}
unsigned int fact2(unsigned int x){
return fact_rec(x,1);
}
Tu constates que pour la version récursive il faut transmettre dans l'appel recursif la valeur de res (fonction fact_rec). Comme l'utilisateur ne doit pas avoir à l'initialiser à 1, on écrit une fonction fact2 qui est celle qu'il manipulera sans avoir à se soucier de la valeur à mettre pour res. J'espère que pour toi c'est plus clair ! Dans le cas d'un arbre on est effectivement de faire des appels récursifs donc il faut réfléchir à tes cas d'arrêts (on a atteint une feulle par exemple) et parcourir chaque branche fille dans ton appel récursif. Bonne chance
|
Hum, la récursivité n'est pas forcément facile à comprendre au début, mais dès que t'a eu le déclic tout marche bien.
|
Alors en fait tu es dans un cas très proche du fact2 que je t'ai proposé. En fait tu as deux variables, le noeud courant (qui correspondant à mon x), et le total calculé (ma variable res). Tu vois donc immédiatemment qu'il va falloir faire un truc dans le même genre. Ta fonction recursive (qui correspond a mon fact_rec) calculera la taille d'un sous-arbre à un noeud donné et prendra en paramètre le total calculé. La fonction faisant le calcul sera donc juste un appel à cette fonction avec res=0 et comme noeud la racine.
|
Bonjour
|
Je n'ai pas testé mais c'est quelque chose dans l'idée
typedef struct noeud{
struct noeud * fg; // fils gauche
struct noeud * fd; // fils droit
} noeud;
typedef struct arbre{
struct noeud * root; // la racine
} arbre;
// on passe n en int * afin que n soit modifié par les appels recursifs
// cf cours sur les pointeurs
void card_rec(noeud * a,unsigned int * n){
if (a->fg){ // si j'ai un fils gauche
// j'ajoute à n le nombre de fils comptés à partir de fg
card_rec(a->fg,n);
}
if (a->fg){ // si j'ai un fils droit
// j'ajoute à n le nombre de fils comptés à partir de fd
card_rec(a->fd,n);
}
++ *n; // j'ajoute le noeud courant
}
unsigned int card(arbre * a){
// actuellement j'ai compté 0 noeuds, et je pars de la racine
unsigned int res=0;
card_rec(a->root,&res);
return res;
}
Bonne chance |
Slt , j'ai le meme probleme , je trouve pas de koi apprendre cette recursivité, mais dernierement g téléchargé des fichiers pdf qui pourraient t'interesser, si tu es tjrs interssée : voici certains liens , sinn laisse ton email je te les enverrai.. bonne chance
|
La récursivité (bis):
|