Recursivite en C++

Fermé
widi70 Messages postés 649 Date d'inscription jeudi 4 janvier 2007 Statut Membre Dernière intervention 22 juillet 2019 - 14 mars 2007 à 19:49
mamiemando Messages postés 33459 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 8 janvier 2025 - 16 mars 2007 à 00:34
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 33459 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 8 janvier 2025 7 813
14 mars 2007 à 20:51
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 jeudi 4 janvier 2007 Statut Membre Dernière intervention 22 juillet 2019 65
14 mars 2007 à 21:14
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 33459 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 8 janvier 2025 7 813
15 mars 2007 à 01:37
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 jeudi 4 janvier 2007 Statut Membre Dernière intervention 22 juillet 2019 65
15 mars 2007 à 19:57
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 33459 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 8 janvier 2025 7 813
16 mars 2007 à 00:34
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