Recursivite en C++

widi70 Messages postés 649 Date d'inscription   Statut Membre Dernière intervention   -  
mamiemando Messages postés 33778 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour à tous, je doit faire un programme qui dessine une courbe de bezier.
pour plus d'information allez voir ce site :
http://cours-info.iut-bm.univ-fcomte...jets1A.html#P3

Donc j'ai réussi à placer tous les points qu'il faut et j'avais même réussi à tracer ma courbe mais je l'ai fait avec une boucle alors qu'il faut le faire avec la récursion.
Ce qui est mon plus gros probleme car ça fait tres peu de temps qu'on a vu la récursivité en cours et j'ai encore beaucoup de mal à comprendre ce principe.
Donc si vous pourriez me donner quelques petits conseils et me mettre sur la voie se serait génial
merci de votre aide.

5 réponses

mamiemando Messages postés 33778 Date d'inscription   Statut Modérateur Dernière intervention   7 884
 
Pfff la recursivité devrait être évitée autant que possible en C/C++ mais bon passons... Bon grosso modo une fonction récursive doit être composée :
- de cas provocant l'appel récursif
- de cas d'arrêt

Exemple :
unsigned int fact(unsigned int x){
  if(x==0) return 1; // cas d'arret
  if(x==1) return 1; // cas d'arret
  return fact(x-1);
}

A priori l'appel récursif consiste simplement à rappeler la fonction en modifiant les paramètres lors de l'appel comme le montre l'exemple ci dessus. Ne pas perdre de vue qu'en C quand tu appelles une fonction les paramètres sont des recopies. C'est pourquoi tu es souvent obligé d'utiliser des pointeurs (l'adresse qui caractérise ce pointeur est recopiée, mais pas ce qui se trouve à cette adresse). Exemple :
struct plop{
  int x = 0;
};

void somme(struct plop p,unsigned int n){
  p.x += n;
  if (n>0) somme(p,n-1); // p va être recopié !!!
}

void somme2(struct plop *ap,unsigned int n){
  p->x += n;
  if (n>0) somme2(ap,n-1);
}

int main(){
  struct plop p1,p2;
  somme(p1,5);
  printf("%d\n",p1.x); // ne retourne pas 1+2+3+4+5... mais 5
  somme(&p2,5);
  printf("%d\n",p2.x); // retourne bien 1+2+3+4+5
  return 0;
}

Bref j'espère que c'est plus clair pour toi... sinon n'hesite pas à poser des questions

Bonne chance
1
widi70 Messages postés 649 Date d'inscription   Statut Membre Dernière intervention   65
 
ben je n'ai pas encore vu l'utilisation des pointeurs en cour donc je pense pas que je devrais les utiliser, je vais reflechir à tous cela; la nuit porte conseil
merci bcp bonne soiree
1
mamiemando Messages postés 33778 Date d'inscription   Statut Modérateur Dernière intervention   7 884
 
A ce moment là laisse tomber ce que j'ai dis à partir du deuxième paragraphe.
1
widi70 Messages postés 649 Date d'inscription   Statut Membre Dernière intervention   65
 
donc voila d'accord j'ai bien compris le principe et j'ai refait quelques exo: donc dans ta fonction tu rapel la fonction.
Encore faut il savoir quel fonction utiliser et a quel moment la rapeller et à mon avis la est toutes la difficulté de la récursivité. Donc j'ai passer mon aprem à réflechir sur la chose et je ne voit vraiment pas comment faire.
Donc si vous pourriez m'aider à réfléchir ce serais vraiment super, je ne vous demande pas la solution car cela ne m'aiderais qu'à très court terme.
Je vois bien ce qui va etre repeter, pour la 1er partie de la courbe:
- apres la construction du point J, le point B devient le point E et on reconstruit les milieux et on recommence jusqu'a ce que A soit égale à E.
Et de même pour l'autre côté de la courbe
mais je ne voit pas comment integrer la recursivité la dedans
je vous remerci vraiment beaucoup de votre aide et j'espere qu'un jour je pourrai en faire autant
1

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

Posez votre question
mamiemando Messages postés 33778 Date d'inscription   Statut Modérateur Dernière intervention   7 884
 
Vois la récursivité comme les suites en mathématiques. Tu définis le résultat d'une suite u_n à partir d'un ou plusieurs termes précédent de la suite (par exemple u_(n-1)), et bien sur il faut initialiser ta suite avec des termes initiaux (genre u_0).

Si on reprend l'exemple de la suite factorielle en mathématiques :

n! = 1 * 2 * 3 * ... * n (version itérative) et par convention 0! = 1
unsigned int fact(unsigned int n){
  unsigned int i,res=1;
  if (n==0) return 1;
  for(i=1;i<=n;++i) res = res * i;
  return res;
}

n! = n*(n-1)! (version récurssive) avec 0! = 1, ce qui correspond à la suite :
u_n = n * u_(n-1)
u_0 =1
unsigned int fact(unsigned int n){
  if (n==0) return 1;
  return n*fact(n-1);
}

Je sais pas si ça t'aide à mieux voir comment ça marche...

Bonne chance
1