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

6 réponses

1 2
Avatar
Loïc Joly
Vincent Richard wrote:



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 ?


std::string fct(int n)
{
if (n == 0)
return "0";
else
return boost::lexical_cast<string>(-n) + ' ' +
fct(n-1) + ' ' +
boost::lexical_cast<string>(n) ;
}

--
Loïc


Avatar
Fabien LE LEZ
On Thu, 13 Nov 2003 21:09:45 +0100, "ANNE Alexis"
wrote:

En même temps, pourquoi ne pas utiliser une simple boucle itérative, afin de
ne pas gaspiller de ressources en appels de fonctions?


AMHA, c'est une condition imposée par un prof.

--
;-)

Avatar
kanze
Vincent Richard wrote
in message news:<3fb3bf85$0$13287$...


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


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


Peut-être, mais c'est bien la solution que j'utiliserais, moi. Avec
quelque changements mineur :

void
fnc( int n )
{
assert( n >= 0 && n != INT_MAX ) ;
for ( int i = -n ; i <= n ; ++ i ) {
if ( i != -n ) {
std::cout << ' ' ;
}
std::cout << n ;
}
}

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16


Avatar
Pierre Maurette
"kip" a écrit
[...]
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 !


Culture générale ou devoir, peu importe. La solution proposée est
certainement ce qu'attend le rédacteur de l'exercice.


Une autre version :

void fct (int n)
{
static const fin = -n-1;
if (n == fin) return;
cout << -n << " ";
fct(n-1);
}
Je crains que le fait de vouloir utiliser un static dénote que vous ne

raisonnez pas "récursif" mais "boucle".
En revanche, vous pourriez modifier le code de Benoit en :

void fct( int n )
{
static unsigned int nb_appels = 0; // ou variable globale
int id_appel = rand();
nb_appels++;
std::cout << - n << "/" << nb_appels << "/" << id_appel << std::endl;
if( n == 0 ) return;
else fct( n-1 );
std::cout << n << "/" << nb_appels << "/" << id_appel << std::endl;
}

La sortie de ce truc-là peut vous éclairer.

Pierre


Avatar
ANNE Alexis
"Fabien LE LEZ" a écrit dans le message de news:

On Thu, 13 Nov 2003 21:09:45 +0100, "ANNE Alexis"
wrote:

En même temps, pourquoi ne pas utiliser une simple boucle itérative, afin
de


ne pas gaspiller de ressources en appels de fonctions?


AMHA, c'est une condition imposée par un prof.



Dans ce cas, en effet, mieux vaut utiliser la récursivité.


Avatar
Samuel Krempp
le Thursday 13 November 2003 18:40,
écrivit :


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


on peut ajouter des arguments artificiels aux fonctions récursives dans ce
but, comme ce qui suit :

void fct(int n, int n0=n) {
cout << -n << " ";
if(n==-n0) return;
fct(n-1, n0);
}

mais en l'occurence je prefere la réponse avec un seul argument de benoit.

--
Sam


1 2