J'écris un programme qui imprime les 10 premiers nombres naturels de la récursivité. Tout d'abord, je pose un paramètre "--num" et j'ai changé le paramètre sur "num - 1" et il imprime quoi J'étais attendue. P> Input: 10
Output: 1 2 3 4 5 6 7 8 9 10
4 Réponses :
Aussi, notez que votre fonction Vous pouvez utiliser un débogueur et passer à travers votre programme pour voir quand les choses vont mal ou ajouter des impressions de débogage. Ceci est votre programme d'origine avec des impressions avant em> et après em> l'appel récursif. Le nombre avant et après devrait être le même pour que l'algorithme fonctionne, et comme vous le verrez, ils ne le sont pas. P> num - 1 code> crée un nouveau
int code>, en tant que copie de
num code> et soustrait 1 de ce
int < / code>.
- num code> soustrait 1 à partir de
num code> lui-même. p>
natural_numbers code > devrait être
void code>. Il dit maintenant
int code> mais vous ne retournez rien d'autre que votre programme a vraiment non définie Comportement . P>
Merci, je l'obtiens, mais pourquoi il imprime le numéro 1 deux fois et le numéro 10 manquant 10?
Puisque vous modifiez num avant de l'imprimer, 10 ne peut pas être imprimé (si 10 est votre numéro d'entrée d'origine). 1 est imprimé pour la même raison. Lorsque NUM == 2, vous modifiez num et appelez NATURAL_NUMBERS QUELLE IMPRIMER 1, et lorsque l'appel renvoie, vous imprimez 1 à nouveau.
En première partie, vous modifiez la valeur num num avec pré-décrément Donc, si vous suivez si vous appelez l'original - code> opérateur. Votre deuxième code ne change pas la valeur numérique (il passe temporaire
Num-1 code> Valeur à l'appel de fonction).
printf code>
num Code> Valeur c'est différent. Dans la première partie de code, il est décrémenter par un, et en second partie, il est original
num code> numérique. P>
natural_numbers code> avec
Num == 10 code> ci-dessous Vous pouvez suivre la manière dont sa valeur change / ne change pas dans les lignes suivantes. P>
// num (its value)
int natural_numbers(int num) { // 10
if (num > 1) // Base case // 10
natural_numbers(--num); // 10 / and 9 (after execution)
printf("%d ", num); // 9
}
int natural_numbers(int num) { // 10
if (num > 1) // Base case // 10
natural_numbers(num - 1); // 10
printf("%d ", num); // 10
}
Ohh, alors c'est pourquoi. Merci beaucoup :))
Si vous souhaitez passer C spécial num - 1 code> sur une fonction (comme en fait que vous le faites ici), la façon de le faire est d'appeler simplement
natural_numbers (num - 1) code>. Rien de fantaisie nécessaire. Ce n'est pas une coïncidence qui est la façon qui fonctionne. P>
++ code> et
- code> Les opérateurs font de manière significative - que vous ne devez simplement ajouter ou soustraire 1. Ils ajoutent ou soustrayez 1, et Ils stockent la variable incrémentée ou décrémentée dans l'emplacement d'origine em>. Donc,
- num code> ne doit pas simplement soustraire 1 à partir de
num code>, il stocke la valeur
num - 1 code> retour dans
num code >. Mais ce n'est pas ce que vous voulez ici. Vous ne souhaitez pas modifier
num code>, car sur chaque appel récursif, vous souhaitez imprimer la valeur de
num code> que vous avez commencé avec, pas em> la version décrémentée que vous avez transmise dans la récursion. P>
Vous pensez que nous voudrions appeler cette fonction par NUM 3
Lorsque vous utilisez --num, c'est comme si vous modifiez ce numéro entré dans le numéro naturel_function SO P>
La pile locale lorsque NATURAL_NUMBERS ( 3) appelé ressemble à p> maintenant si nous appelons cette fonction avec (num - 1)
Cela signifie que vous ne voulez pas modifier la variable "NUM" entrant dans son propre bloc de pile local. p> La pile locale pour (NUM-1) sera comme ceci: p>
- Num code> Décréments
num code> par 1, puis vous imprimez ce numéro sur la ligne suivante.
Dupliqué possible de Quelle est la différence entre ++ i et i ++? a>
Voilà ceci c ou c ++
Jack, n'avez-vous pas accepté l'une des réponses précédemment (@ Bartek's Si je ne me trompe pas)? Qu'est-ce qui vous a fait changer d'avis pour rouvrir cette question?