J'utilise une récursion pour calculer deux variables. Ce qui m'a confondu, c'est lorsque je définis une variable hors de la méthode en tant que variable de membre, elle renvoie la valeur qui est attribuée à la variable au lieu de la première attribuée à la variable? Pourquoi cela arrive-t-il? Je me demande comment cela s'est-il passé? Existe-t-il d'autres règles qui influencent l'ordre de retour de la récupération? Pour moi, je pense que si seulement je n'utilise pas ou non, il devrait s'agir d'une copie de la variable de membre pour calculer. Est-ce que quelqu'un pourrait m'aider à trouver la raison?
Merci beaucoup. P> p>
3 Réponses :
La valeur de Si vous souhaitez avoir une copie, faites-la vous-même: P> A code> est modifiée par test () code>. Chaque appel de test code> Utilisez la même variable A code>. private int Test()
{
int b = a--;
if(a != 0)
{
Test();
}
return b;
}
Peut-être que je ne me suis pas énoncé. Je veux dire dans mon cas, lors de l'utilisation d'une variable de membre dans une méthode, il suffit de faire une copie de la valeur de la variable de membre au lieu d'utiliser la même référence. Donc, il devrait obtenir le même résultat en récursivité par rapport à l'utilisation d'un int directement. Mais je reçois des différentes lors de l'utilisation de la variable membre
Le mot clé code> est omis, cela fait ressembler la variable de membre une variable locale normale, mais ils sont différents en principe. Les variables de membre se réfèrent à la même instance.
private int Test()
{
this.a--;
if(this.a != 0)
{
this.Test();
}
return this.a;
}
Oui, la variable de membre se réfère à la même instance. Mais je suppose que lorsque vous utilisez une variable de membre dans une méthode, il suffit de faire une copie de la valeur de la variable de membre au lieu d'utiliser la même référence. Donc, il devrait avoir le même résultat en récursives. Mais je reçois des différentes lors de l'utilisation de la variable membre
La variable locale est une copie, la variable de membre n'est pas.
Ceci fonctionne comme prévu: Si vous ne retournez pas le résultat du test, il va simplement exécuter la méthode puis passer à l'instruction suivante de la méthode. Dans votre cas, sans EDIT: P> Un exemple de passage par référence pour avoir un code de travail similaire p> Test de retour (A) Code> Cela ne fait que rien avec le résultat du test (int A). P>
Je sais sinon retour, il ira à la prochaine déclaration. Mais ce que je me demande, c'est pourquoi cela renvoie des valeurs différentes?
En C # Par défaut, un INT n'est pas adopté par référence, vous devez le spécifier explicitement. Dans votre cas, vous auriez besoin de passer un par référence (voir la réponse modifiée)
Je ne pense pas qu'une référence soit nécessaire ici car je ne suis pas destiné à transmettre la valeur de retour à la variable membre. Ce que je concerne, c'est pourquoi le test (a) et le test (3) renvoie une valeur différente dans ce cas
Si vous voulez voir exactement ce que vous voulez peut-être utiliser un point de rupture et l'exécuter étape par étape pour voir comment il se comporte. Les deux extraits de code que vous avez montrés sont complètement différents. Étant donné que le premier utilise une variable déclarée dans le programme de classe, votre méthode pourrait être annulée et ne rien renvoyer car chaque fois que vous l'appelez, cela affecte cette instance de A donc donnant un parémètre ou un retour qu'elle diminuera par 1 Chaque test () est appelé. Dans le second cas, vous donnez un parémètre appelé A afin que la méthode fonctionnera sur ce paimètre, car elle est transmise par valeur, 1/2
Peu importe que vous exécutez un test () parce que vous ne faites rien avec la valeur de celui-ci dans votre déclaration IF. C'est donc ce qui se passe dans le deuxième extrait: test (3) -> 3-- = 2, puis 2> 0 alors test (2) renvoie 1 et l'intérieur, il teste (1) et retourne 0. Cependant, vous ne l'utilise pas chaque fois que la méthode est appelée, elle quitte la déclaration IF et va à retourner A et dans le premier appel, il était égal à 2. J'espère que c'était un peu plus clair 2/2
Merci David. J'ai eu ce que vous vouliez dire et déboguer le code étape par étape. Je pense que je peux avoir le point. Merci beaucoup.
Désolé je copie le même code deux fois. J'ai mis à jour le post! Merci!
@Grant Je pense que avant la fin de la récursivité, il utilise la dernière valeur obtenue de la méthode précédente n'utilisant pas la valeur de la variable de membre. Et le processus de débogage a montré que A est 2, 1, 0 pour le script. Le différent est que lorsque la récursivité retourne, le premier script renvoie 0,0,0,0 pendant trois fois, tandis que la seconde retourne 0,1,2
S'il vous plaît poster exemple de reproductible minimal . Il n'ya aucun moyen que le deuxième code compilait comme indiqué (vous n'avez pas affiche la version sans argument de
test () code> qui est appelé là)