OVH Cloud OVH Cloud

Problème fonction récursive ....

16 réponses
Avatar
kip
Hello !

Je voudrais écrire une fonction récursive qui affiche le résultat suivant,
suivant un entier n positif, non nul :


-n -(n-1) -(n-2) ... -2 -1 0 1 2 ... (n-2) (n-1) n


Voici la fonction que j'ai faite, mais elle ne fonctionne pas comem je
voudrais,
en fait, elle s'arrete à 0 (normal). Le problème, c'est que je n'arrive pas
à définir la condition d'arret.
Pourriez-vous m'aider SVP ... ?


[code]
int fct (int n)
{
if (n==-n) return n; //Un peu débile comme condition.....
cout<< (-n)<<' ';
return(fct(n-1));
}
[/code]


Merci de votre aide

10 réponses

1 2
Avatar
Vincent Richard

Je voudrais écrire une fonction récursive qui affiche le résultat suivant,
suivant un entier n positif, non nul :

-n -(n-1) -(n-2) ... -2 -1 0 1 2 ... (n-2) (n-1) n

Voici la fonction que j'ai faite, mais elle ne fonctionne pas comem je
voudrais,
en fait, elle s'arrete à 0 (normal). Le problème, c'est que je n'arrive
pas à définir la condition d'arret.
Pourriez-vous m'aider SVP ... ?

int fct (int n)
{
if (n==-n) return n; //Un peu débile comme condition.....
cout<< (-n)<<' ';
return(fct(n-1));
}


int fct(int n)
{
if (n == 0)
std::cout << "0" << ' ';
else
{
std::cout << -(n) << ' ';
fct(n - 1);
std::cout << (n) << ' ';
}
}

?

Vincent

--
vmime, une bibliothèque C++ sous licence GPL pour parser et générer
des messages au format MIME : http://www.sourceforge.net/projects/vmime/

Avatar
Vincent Richard

int fct(int n)
{
if (n == 0)
std::cout << "0" << ' ';
else
{
std::cout << -(n) << ' ';
fct(n - 1);
std::cout << (n) << ' ';
}
}


Oups, pas de "return". Evidemment, il faut soit passer la fonction en
'void', soit retourner une valeur. Mais quelle valeur ?

Vincent

--
vmime, une bibliothèque C++ sous licence GPL pour parser et générer
des messages au format MIME : http://www.sourceforge.net/projects/vmime/

Avatar
Vincent Richard

int fct(int n)
{
int i;
for(i=-n; i<=n; i++)
{
cout<<n<<' ';
}
}


Euh... ca ne ressemble pas trop à une fonction *récursive*. :-)

Vincent

--
vmime, une bibliothèque C++ sous licence GPL pour parser et générer
des messages au format MIME : http://www.sourceforge.net/projects/vmime/

Avatar
Cedric
Je me lance mais des personnes plus calées que moi me corrigeront si il y a
mieux...

int fct(int n)
{
int i;
for(i=-n; i<=n; i++)
{
cout<<n<<' ';
}
}

Cedric,

[code]
int fct (int n)
{
if (n==-n) return n; //Un peu débile comme condition.....
cout<< (-n)<<' ';
return(fct(n-1));
}
[/code]


Avatar
Cedric
Euh... ca ne ressemble pas trop à une fonction *récursive*. :-)


En effet, autant pour moi !
Je ferais bien de reprendre quelques cours de lecture :-)

Avatar
Benoit Rousseau
kip wrote:
Hello !

Je voudrais écrire une fonction récursive qui affiche le résultat suivant,
suivant un entier n positif, non nul :


-n -(n-1) -(n-2) ... -2 -1 0 1 2 ... (n-2) (n-1) n


Voici la fonction que j'ai faite, mais elle ne fonctionne pas comem je
voudrais,
en fait, elle s'arrete à 0 (normal). Le problème, c'est que je n'arrive pas
à définir la condition d'arret.
Pourriez-vous m'aider SVP ... ?


[code]
int fct (int n)
{
if (n==-n) return n; //Un peu débile comme condition.....
cout<< (-n)<<' ';
return(fct(n-1));
}
[/code]


Merci de votre aide




Il n'y a pas besoin de valeur de retour puisqu'elle ne sert à rien (Elle
retournera toujours -n dans ton cas).

Pour faire de la récursion, il faut commencer par penser aux cas les
plus petits fct( 0 ), puis fct( 1 ), puis ... puis généraliser.

Tu aurais peut être pu commencer par penser à afficher -n -(n-1) ... 0
puis voir la suite une fois que ca aurait marché.

Pour être gentil, je te files le code simple, mais j'avais apris à mon
époque que ce groupe n'était pas fait pour résoudre les devoirs maisons ;-)


void fct( int n )
{
cout << - n << " " ; //Afficher -n
if( n == 0 ) return; // 0 ne sera affiché qu'une seule fois
else fct( n-1 ); //Afficher -(n-1) ... (n-1)
cout << n << " "; //Afficher n
}

--
--------------------------------------------
Benoît Rousseau : roussebe at spray dot se
Jouez en programmant : http://realtimebattle.sourceforge.net/

Avatar
kip
"Cedric" a écrit dans le message de
news:hhPsb.21480$
Euh... ca ne ressemble pas trop à une fonction *récursive*. :-)


En effet, autant pour moi !
Je ferais bien de reprendre quelques cours de lecture :-)



:) Merci quand même !


Avatar
Vincent Richard

Une autre version :

void fct (int n)
{
static const fin = -n-1;
if (n == fin) return;
cout << -n << " ";
fct(n-1);
}


Non, ça ne fonctionne pas. La variable 'static' est initialisée seulement
au premier appel de 'fct'.

Si tu fais 2 appels de suite :

fct(5);
fct(3);

renvoie :

-5 -4 -3 -2 -1 0 1 2 3 4 5
-3 -2 -1 0 1 2 3 4 5 ('fin' vaut toujours 5 ici...)

Vincent

--
vmime, une bibliothèque C++ sous licence GPL pour parser et générer
des messages au format MIME : http://www.sourceforge.net/projects/vmime/

Avatar
kip
Il n'y a pas besoin de valeur de retour puisqu'elle ne sert à rien (Elle
retournera toujours -n dans ton cas).


Oui, en effet !

Pour faire de la récursion, il faut commencer par penser aux cas les
plus petits fct( 0 ), puis fct( 1 ), puis ... puis généraliser.

Tu aurais peut être pu commencer par penser à afficher -n -(n-1) ... 0
puis voir la suite une fois que ca aurait marché.


C'est ce que j'ai fait, mais ça s'arretait à 0 !!!

Pour être gentil, je te files le code simple, mais j'avais apris à mon
époque que ce groupe n'était pas fait pour résoudre les devoirs maisons
;-)


Ben, pour une fois, c pas un devoir maison, mais c pour ..... disons, de la
ciulture générale !

void fct( int n )
{
cout << - n << " " ; //Afficher -n
if( n == 0 ) return; // 0 ne sera affiché qu'une seule fois
else fct( n-1 ); //Afficher -(n-1) ... (n-1)
cout << n << " "; //Afficher n
}


Oui, elle fonctionne !

Une autre version :

void fct (int n)
{
static const fin = -n-1;
if (n == fin) return;
cout << -n << " ";
fct(n-1);
}

Avatar
ANNE Alexis
"kip" a écrit dans le message de news:
3fb3c13e$0$27045$

"Cedric" a écrit dans le message de
news:hhPsb.21480$
Euh... ca ne ressemble pas trop à une fonction *récursive*. :-)


En effet, autant pour moi !
Je ferais bien de reprendre quelques cours de lecture :-)



:) Merci quand même !




En même temps, pourquoi ne pas utiliser une simple boucle itérative, afin de
ne pas gaspiller de ressources en appels de fonctions?
Ne connaissant pas l'utilisation que tu souhaite en faire, je ne peux
répondre à ta place,mais à mon avis, ce serait préférable.



1 2