J'ai un assanigment dans mon cours pour écrire une fonction récursive qui affichera les signes '%' et '#' alterné par le nombre que l'utilisateur a entré. donc si je dis que l'utilisateur a entré le numéro 5, le résultat sera comme ceci: '% #% #%'.

Je pense que j'ai fait la plupart du travail. le seul problème que j'ai pour le moment est que la chaîne que je dois afficher les signes continue à devenir «nulle» à chaque itération effectuée par la fonction.

Voici mon code:

public static string ShowGibrish(int num)
{
    string s="";
    while (num!=0)
    {
        if (num % 2 == 0)
        {
            s = s+ "%";
            ShowGibrish(num - 1);
        }
        else if (num % 2 != 0)
        {
            s =s+ "#";
            return ShowGibrish(num - 1);
        }

    }
    return s;
}

Un autre étudiant a utilisé stringbuilder pour créer la chaîne à afficher, et a utilisé une autre fonction privée et l'a appelée avec la fonction publique. mais je pense que mon code pourrait aussi fonctionner.

-4
Dolev 3 mai 2017 à 20:52

3 réponses

Meilleure réponse

Essayez plutôt ceci:

public static string ShowGibberish(int num)
{
    if (num == 0) { return ""; }
    else {
         if (num % 2 == 0) {return "%" + ShowGibberish(num-1);}
         else {return "#" + ShowGibberish(num-1);}
    }
}

Votre code mélange une approche itérative et récursive. Utilisez l'un ou l'autre uniquement pour résoudre ce problème proprement.

1
xandermonkey 3 mai 2017 à 18:33

Le premier problème que vous rencontrez est que vous déclarez une nouvelle chaîne au début de la méthode, mais vous ne transportez jamais cette chaîne dans la fonction récursive, ce qui signifie que vous perdez toute la progression de la concaténation.

Le deuxième problème est que vous avez une boucle while pour une raison quelconque, pour autant que je sache, ce n'est pas nécessaire ici.

  1. Commencez par ajouter un paramètre facultatif à la fonction: string s = "".
  2. Retirez la boucle while, ce n'est pas nécessaire
  3. La première chose à faire est de vérifier si num vaut 0 ou non, et de renvoyer s si c'est le cas.
  4. Modifiez les s en fonction de votre logique pair / impair
  5. Puis retourne le résultat de l'appel récursif ShowGibrish(num - 1, s)

J'ai supprimé le code parce que je n'ai pas saisi la partie devoirs.

1
maccettura 3 mai 2017 à 18:06

On dirait que le problème réside dans votre boucle while. Ce qui se passe, c'est que chaque instance de la fonction sur la pile exécute une boucle while au lieu que la boucle soit uniquement gérée par récursivité. Chaque instance de la fonction ne doit s'exécuter que si le cas de base! = 0 par opposition à tandis que le cas de base! = 0.

Les variables sont étendues à leurs fonctions respectives et donc, dans l'état actuel de votre code, la valeur que la boucle while évalue ne peut jamais atteindre 0.

Désolé, je ne vais pas vous fournir de code car il s'agit d'un devoir.

0
Patrick Kelly 3 mai 2017 à 18:03