Probleme avec la récursivité... SVP [Résolu]

Signaler
Messages postés
17
Date d'inscription
dimanche 25 juillet 2004
Statut
Membre
Dernière intervention
20 juillet 2007
-
Messages postés
17
Date d'inscription
dimanche 25 juillet 2004
Statut
Membre
Dernière intervention
20 juillet 2007
-
Bonjour, voici une fonction récursive :

void m(DWORD i, char stem [10] = "")
{
    if (i < 2)
    {
        stem[i] = 'a';
        m(i+1, stem);
// ici
        stem[i] = 'b';
        m(i+1, stem);
    }
    return;
}

elle est appelée dans le programme principale par : m(0, "zzz");
mon probleme, la variable "stem" n'est pas restitué apres retour d'un apel recursif (où jai placé le commentaire, par exemple), alors que la variable "i" est bien restitué...
commment faire pour regler ce probleme ?
merci

6 réponses

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
#include <windows.h>
#include <string>
#include "resource.h"

using namespace std;

void m(DWORD i, string stem)
{
    if (i < 1)
    {
        stem[i] = 'a';
        m(i+1, stem);
        stem[i] = 'b';
        m(i+1, stem);
    }
    return;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    m(0, "zzz");
    return 0;
}

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Normalement, ca ne devrait pas compiler, car "zzz" est une chaine constante.
Mais bon ca passe, et dans ce cas on ne sait pas trop ce qui peut se passer. En tous cas ce n'est pas surprenant que le chaine soit modifiée, car tu passes son adresse, elle est donc directement modifiée

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
17
Date d'inscription
dimanche 25 juillet 2004
Statut
Membre
Dernière intervention
20 juillet 2007

OK merci, est ce possible de faire en sorte que la chaine soit locale a la fonction ? un peu comme la variable "i"
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
1) Redéclarer un tableau local, et recopier stem dedans
void m(DWORD i, char stem [10] = "")
{
  char stemLocal[10];
  strcpy(stemLocal, stem);
  // Tu travailles sur stemLocal
  ...
}

2) Utiliser le template string, qui te permet de passer une chaine par valeur
void m(DWORD i, string stem)

{

  // stem est passé par valeur, tu peux le modifier localement

}
_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
17
Date d'inscription
dimanche 25 juillet 2004
Statut
Membre
Dernière intervention
20 juillet 2007

merci, j'ai essayé la 2ème possibilité vu quelle correspond a ce que je veut faire, mais ca me donne une erreur a la compilation : parametre non reconnu ligne 5
voila le source, vous etes sure qu'on peut utiliser string comme parametre ?

#include <windows.h>
#include <string.h>
#include "resource.h"

void m(DWORD i, string stem)
{
    if (i < 1)
    {
        stem = 'a';
        m(i+1, stem);
        stem = 'b';
        m(i+1, stem);
    }
    return;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    m(0, 'z');
    return 0;
}
Messages postés
17
Date d'inscription
dimanche 25 juillet 2004
Statut
Membre
Dernière intervention
20 juillet 2007

merci beaucoup, je vient de tester en ajoutant une messagebox, le resultat est correcte.
void m(DWORD i, string stem)
{
    if (i < 2)
    {
        stem[i] = 'a';
        m(i+1, stem);
          MessageBox(NULL, stem.data(), "Test", MB_OK);
        stem[i] = 'b';
        m(i+1, stem);
    }
    return;
}
merci encore
bye