Recursivité

adil1251985 Messages postés 7 Date d'inscription mercredi 7 février 2007 Statut Membre Dernière intervention 19 novembre 2008 - 19 nov. 2008 à 10:42
cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 - 19 nov. 2008 à 19:08
bonjour; 
 j'ai créé une fonction recursive qui diminue le premier nombre par le deuxieme(= 1) jusqu'a obtenir zero .
question : pourquoi quand je tape un petit nombre la fonction s'a marche mais pour les grand nombre non.
exemple : pour les nombres inférieur à 4189

code

#include
#include <string>
#include <conio.h>
#include <stdlib.h>
#include <sstream>

using namespace std;

//fonction qui diminue le premier nombre par le deuxieme( =1) jusqu'a obtenir zero
string soustraction(string nbr1,string nbr2){

int Tnbr1; // contient la taille du premier nombre 'nbr1' (nombre de chiffre)

int retenu=0,compteur=0,aide1,aide2,resultat;

string resultatF;

ostringstream oss;// un flux de sortie

Tnbr1= nbr1.length();

char *tab1 = (char *)nbr1.c_str(); // creation d'un tableau de caracteres du 1er nombre

char *tab2 = (char *)nbr2.c_str(); // creation d'un tableau de caracteres du 2eme nombre

int tabResultat[Tnbr1]; // declaration d'un tableau pour le resultat de la difference

bool TenZero=true; // un boolean pour tester si le resultat retourné contient que des zero

// boucle pour faire la difference entre les 2
//nombres et cela caractere par caractere en comencant par le dernier
for(int j=Tnbr1-1; j>=0; j--)
{
aide1 = (int)(tab1[j]-'0');// conversion des caracteres du 1er nombre : char --> int
aide2 = (int)(tab2[j]-'0');// conversion des caracteres du 2eme nombre : char --> int
aide2 = aide2 + retenu;
// gestion de la soustraction caractere(int) par caractere(int)
if (aide1=0; j--)
{oss << tabResultat[j];}

// extraire le resultat dans le flux sous le format string( cette fonction doit retournée string !!!)
resultatF=oss.str();

// boucle pour tester si le resultat retourné ne contient que des zero
for(int j=Tnbr1-1; (j>=0)&&(TenZero); j--)
{
if (tabResultat[j]!=0)
{
TenZero = false;
}
}

// affecter au resultat final "0" si tabResultat ne contient que des zero
// sert à sortir de l'appel recusif ' cas de base 'if (TenZero false){resultatF oss.str();}
else{resultatF = "0";}

// affichage du resultat pour chaque appel
cout <<resultatF<<endl;

if(resultatF=="0"){cout <<" Fin "<<endl; return "0";} // cas de base de la fonction recusive " soustraction( , ) "
else{return soustraction(resultatF,nbr2);}
}

main ()
{
string s1,s2="1";
int i1,i2;
cout << " Taper un nombre : " ;
cin >> s1;
i1= s1.length();
i2= s2.length();
if (i1>i2)
{
for(int r=0; r<(i1-i2); r++){
s2 = "0" + s2;
}
}
cout <<"Lancer la soustraction : ";
getch();
cout <<endl<<soustraction(s1,s2)<<endl;
system("pause");
}


<!-- / message -->

5 réponses

adil1251985 Messages postés 7 Date d'inscription mercredi 7 février 2007 Statut Membre Dernière intervention 19 novembre 2008
19 nov. 2008 à 12:34
Personne pour m'aider ???
0
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011
19 nov. 2008 à 13:42
Salut,
je ne pige pas ton algo, et je ne pige pas non plus ce que tu entends par "diminuer un nombre par un deuxième nombre".

Cordialement, uaip.
0
cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 25
19 nov. 2008 à 18:20
Au passage ta fonction n'a rien de récursive.
0
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011
19 nov. 2008 à 18:52
C'est aussi ce que je m'apprêtais à lui dire ^^
Mais étant donné que le code est présenté bizarrement, je n'ai pas et le courage de voir si la fonction s'appelait elle-même ou pas, donc je n'ai rien dit
QUoi qu'en re-regardant là, si on considère que s'appeler dans un return est récursif, alors elle l'est. Mais c'est moche, là.

Cordialement, uaip.
0

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

Posez votre question
cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 25
19 nov. 2008 à 19:08
ha,  effectivement il y a bien un return soustraction.
Désolé, le code était tellement mal indenté que je ne l'ai pas vu.
0
Rejoignez-nous