Pour le code suivant, je m'attendais à la console de générer Cependant, p> est affiché.
Je comprends que c'est une méthode récursive, c'est-à-dire appeler. Juste en difficulté pour comprendre comment ça marche. Ceci est une question d'examen que j'ai lutté avec. P> J'ai essayé de déboguer et je vois que les suivants se produisent: P>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WhileLoopExample
{
class Program
{
private static int WriteToConsole(int Lemmings)
{
int i = Lemmings;
while (i > 0)
{
Console.WriteLine("loop {0}", i);
i = WriteToConsole(i - 1);
}
return Lemmings - 1;
}
static void Main(string[] args)
{
WriteToConsole(3);
Console.ReadKey();
}
}
}
4 Réponses :
C'est parce que vous avez une boucle et em> vous avez une récursion. Vous devez vous débarrasser de l'appel à De plus, vous utilisez la valeur de retour. de l'appel récursif pour influencer Heureusement, ce n'est que quelques étapes, afin que cela puisse être décomposé assez facilement. C'est ce qui se passe. La boucle tandis que la boucle est impliquée, je décris simplement la sortie, les modifications des appels i et les appels récursifs. P> Writetoconsole (I) Code> Intérieur
Writetoconsole CODE> ou Débarrassez-vous de la boucle et collez-vous avec une récursion.
i code> et donc votre
pendant code> boucle. Je pense que cela provoque la principale affaire de votre confusion. P>
You call WriteToConsole(3); // Let's call this 'instance' of the function call 'A'
A prints "Loop 3"
A calls WriteToConsole(2); // Let's call this 'B'
B prints "Loop 2"
B calls WriteToConsole(1) // Let's call this 'C'
C prints "Loop 1"
C calls WriteToConsole(0); // Let's call this 'D'
D doesn't enter it's loop.
D returns -1 (Lemmings - 1, where Lemmings is 0), i becomes -1 in C
C's loop ends because i is -1
C returns 0, i becomes 0 in B
B's loop ends, because i is 0
B returns 1, i becomes 1 in A
A is still in the loop, since its 'i' > 0, so..
A prints "Loop 1" (again)
A calls WriteToConsole(0); // Let's call this 'E'
E returns -1, i becomes -1 in A
A returns 2, this value is ignored in your main function.
End of program
Merci, votre réponse est vraiment utile. Surtout avec les lettres et l'indentation. Je comprends maintenant beaucoup mieux
Pour réaliser ce que vous voulez, dans ce cas, vous avez besoin Voici la solution pour le pendant code>) ou au moyen de A
pendant code> (mais ensuite sans récursion).
pendant code> sans récursion: p>
private static void WriteToConsole(int Lemmings)
{
int i = Lemmings;
while (i > 0)
{
Console.WriteLine("loop {0}", i);
i = i - 1; // Decrease i, no need for recursion here
}
}
Ce n'était pas moi, je jure ;-)
Merci d'avoir répondu Peter, c'est une question d'examen. J'ai maintenant mis à jour le poste.
Dans votre appel récursif, vous passez dans Il y a deux Mais si vous regardez ce qui se passe: p>
Le premier appel a Puis la récursion arrive, passant dans Le deuxième appel a La récursivité se produit, passant dans Le troisième appel a Puis la récursion arrive, passant dans Le quatrième appel a Le retour à l'intérieur du troisième appel: p>
Le troisième appel renvoie retour à l'intérieur du deuxième appel: p>
Le deuxième appel renvoie retour à l'intérieur du premier appel: p>
L'exécution continue d'ici, mais tout sans sortie. Ce qui précède est la raison pour laquelle vous obtenez deux i - 1 code>. Cela devient
lemmings code> - que vous revenez comme
lemmings - 1 code>. P>
-1 code> s se passe - est-ce ce que vous voulez? p>
lemmings code> comme
3 code> et
i code> comme
3 p>. p>. p>.
boucle 3 code> est écrit. p>
3-1 code>: p>
lemmings code> comme
2 code> et
i code> comme
2 p>. p>. p>.
boucle 2 code> est écrit. P>
2-1 code>: p>
lemmings code> comme
1 code> et
i code> comme
1 p>. p>. p>.
boucle 1 code> est écrit. p>
1-1 code>: p>
lemmings code> comme
0 code> et
i code> comme
0 code>. p>.
pendant code> n'est pas entré, donc
0-1 code> est retourné. p> li>
ul> li>
i code> est attribué
-1 code>, donc le moment se termine. p>
1-1 code>. p> li>
ul> li>
i code> est attribué
0 code>, de sorte que le moment se termine. p>
2-1 code>. p> li>
ul> li>
i code> est attribué
1 code>, donc le moment continue. p>
boucle 1 code> est écrit. p> li>
ul>
boucle 1 code> s. P>
Votre problème est que vous ne comprenez pas la notion d'activation de la fonction em>. Chaque activation de la fonction a sa propre copie de Qu'est-ce qui vous gâte ici est que vous avez Nous pouvons voir la sortie reflète ce qui se passe : p> lisez la trace très soigneusement em> jusqu'à ce que vous comprenez ce qui se passe. Vous obtenez quatre em> sorties de i code> et sa propre copie de
lemmings code>, ce qui sont complètement indépendants em> de toutes les autres fonctions.
Writetoconsole Code>, et tous ont leur propre < / em> copie de
i code> et leur copie em> copie de
lemmings code>. Illustrons que, en instrumenté votre programme pour montrer chaque activation de fonction différente et quelles sont les valeurs de chaque variable à chaque point: p>
boucle x code> car l'appel numéro 1 est dans la boucle supérieure lorsque
i code> est 3 et après l'appel récursif,
I code> est 1. L'état de la boucle est rempli, appelez donc 1 imprime les deux
Loop 3 code> et
boucle 1 code>. p> p>
Merci Eric. Votre réponse me permet de déboguer et de mieux comprendre cela. J'aurais dû clarifier, c'est une question d'examen que j'ai lutté avec. Impossible de trouver beaucoup sur le Web pour m'aider à comprendre, peut-être que je ne cherche pas la bonne chose (essayé et pendant des exemples de boucle). Beaucoup apprécient vos efforts et votre temps.
@Enzo: Droite, j'ai pensé que c'était probablement un problème de devoirs ou quelque chose comme ça; C'est pourquoi toutes les personnes qui vous ont dit "tu le fais mal" étaient inutiles. Vous êtes très bienvenu. La récursion peut être délicate à la raison de.
Vous mélangez la récursion avec l'itération. La durée de votre itération (nombre d'itérations de boucle) dépend de la valeur Lemming donnée ainsi que de la valeur de retour de Writetoconsole. Toutefois, la valeur de retour de Writetoconsole elle-même ne dépend pas d'appels récursifs d'écrans de circulation, mais uniquement sur l'argument de Lemmings qui n'est pas modifié dans la méthode. Peut-être que ce sera plus facile pour vous de comprendre si vous dessinez le flux de votre programme sur papier comme organigramme ....
Vous n'êtes pas obligé de descendre ce trou de lapin très profond pour voir ce qui se passe. Il suffit de regarder lorsque vous appelez Writetoconsole la première fois avec Lemmings = 3. Maintenant, le premier appel récursif de Writetoconsole aura son argument de Lemmings défini sur 2, ce qui en résulte renvoyant la valeur
1 code>. Essayez de comprendre cela. Maintenant, tandis que l'appel récursif de Writetoconsole (et d'autres appels récursifs davement dans le trou de lapin) Imprimez «boucle 2» et «boucle 1», la valeur de retour de
1 code> pour les tout premiers causes d'appel récursif une copie supplémentaire de "boucle 1".