Initialiser une liste : fonction récursive ?

netwebzone Messages postés 55 Date d'inscription dimanche 12 décembre 2004 Statut Membre Dernière intervention 22 août 2008 - 2 déc. 2006 à 08:59
cs_italiasky Messages postés 8 Date d'inscription dimanche 19 mars 2006 Statut Membre Dernière intervention 6 décembre 2009 - 3 déc. 2006 à 10:22
Bonjour


Je dois créer une fonction qui initialise une liste chaînée à partir
d'un nombre d'élement passé en paramètre pour la taille de la liste.

J'ai réussi à créer une version itérative de cette fonction ;
<!-- BEGIN TEMPLATE: bbcode_code -->

Code :

 
list initialize_list(list essai, int nb_element)
{
int i;
 
for(i=1;i<=nb_element;i=i+1)
{
essai = insert_tail(essai,rand()%20); //fonction qui ajoute en queue de liste un élément de valeur passé en 2eme parametre
}
 
return essai;
}
 

<!-- END TEMPLATE: bbcode_code -->

Mais j'ai un probleme pour créer une fonction récursive, j'ai fait ceci mais ca ne marche pas, ca me créer un seul élément :
<!-- BEGIN TEMPLATE: bbcode_code -->

Code :

 
list initialize2_list(list essai, int nb_element)
{
if(nb_element==1)
{
return essai = insert_tail(essai,rand()%20);
}
else
{
return essai = initialize2_list(essai,nb_element-1);

}
}
 

<!-- END TEMPLATE: bbcode_code -->

Si quelqu'un peut m'éclairer... merci

Bonne journée

8 réponses

mezaya Messages postés 202 Date d'inscription dimanche 18 mai 2003 Statut Membre Dernière intervention 6 mars 2010
2 déc. 2006 à 09:59
la fonction récursive doit pouvoir ajouter un element a chaque fois qu'elle est appeler.
la fonction récursive doit ressembler a ça:


list initialize2_list(list essai, int nb_element)
{
essai = insert_tail(essai,rand()%20);
if(nb_element==1)
{
// j'arrete la récursivité
return essai;
}
else
{
return essai = initialize2_list(essai,nb_element-1);

}
}



Voili,Voilou [;)]
0
mezaya Messages postés 202 Date d'inscription dimanche 18 mai 2003 Statut Membre Dernière intervention 6 mars 2010
2 déc. 2006 à 10:11
désolé pour la mise en page. donc revoici la fonction :

list initialize2_list(list essai, int nb_element)
{
essai = insert_tail(essai,rand()%20);
if(nb_element==1)
{ // j'arrete la récursivité
return essai;
}
else
{
return essai = initialize2_list(essai,nb_element-1);
}
}
0
netwebzone Messages postés 55 Date d'inscription dimanche 12 décembre 2004 Statut Membre Dernière intervention 22 août 2008
2 déc. 2006 à 10:30
Oh miracle ca marche :) lol

Merci beaucoup mais dis-moi, est-ce que t'aurais 5 min pour m'expliquer comment t'as fait, comment t'as réfléchi pour voir ce qu'il manquait que j'essaye de comprendre ce qui m'a échappé... enfin si tu as le temps...

Merci
Bonne journée
0
mezaya Messages postés 202 Date d'inscription dimanche 18 mai 2003 Statut Membre Dernière intervention 6 mars 2010
2 déc. 2006 à 11:08
pour que la récusivité marche, il faut que pour chaque appel de initialize2_list() on ajoute un element dans la liste. Or dans ton 1er code l'ajout ne se faisait que quand (nb_elment == 1) ; ce test ne sera vrai qu'une seul fois.

alors que maitenant chaque appel a initialize2_list() ajoute un element. Le test (nb_element == 1) est juste le test de fin de récusivité.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
netwebzone Messages postés 55 Date d'inscription dimanche 12 décembre 2004 Statut Membre Dernière intervention 22 août 2008
2 déc. 2006 à 11:12
ok merci
Oui c'est vrai c'était tout bête en fait, je remarquais bien que ca m'ajoutait qu'un seul élément a chaque fois mais je comprenais pas pourquoi, il fallait juste sortir l'ajout d'élément du bloc de la condition d'arrêt, ce qui est logique en fait...

Merci beaucoup
Bonne journée
0
mezaya Messages postés 202 Date d'inscription dimanche 18 mai 2003 Statut Membre Dernière intervention 6 mars 2010
2 déc. 2006 à 11:13
un exemple :

initialize2_list(list,3)

-> insert_tail(list, X )
test(nb_element==1) // = FAUX
initialize2_list(list,2)

-> insert_tail(list, X )
test(nb_element==1) // = FAUX
initialize2_list(list,1)

-> insert_tail(list, X )
test(nb_element==1) // = VRAI
<-
<-
<-
FIN
0
netwebzone Messages postés 55 Date d'inscription dimanche 12 décembre 2004 Statut Membre Dernière intervention 22 août 2008
2 déc. 2006 à 12:02
ouais exactement merci je vois mieux le truc maintenant ;)

Bonne journée
0
cs_italiasky Messages postés 8 Date d'inscription dimanche 19 mars 2006 Statut Membre Dernière intervention 6 décembre 2009
3 déc. 2006 à 10:22
Bonjour,

Euh j'ai changé la fonction de la manière suivante :

list initialize_list_rec(list essai, int nb_element)
{
if(nb_element!=0)
{
essai = insert_tail(essai,rand()%20;
return essai = initialize_list_rec(essai,nb_element-1);
}
 
return essai;
}

Elle est mieux comme ca non ? C'est pas plus "esprit récursif" ?

Merci ++
0
Rejoignez-nous