-2
votes

Quelle est la différence entre --i et i-1 dans un paramètre en C?

J'écris un programme qui imprime les 10 premiers nombres naturels de la récursivité. Tout d'abord, je pose un paramètre "--num" xxx pré> xxx pré>

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 :


1
votes

num - 1 crée un nouveau int , en tant que copie de num et soustrait 1 de ce int < / code>.

- num soustrait 1 à partir de num lui-même.

Aussi, notez que votre fonction natural_numbers devrait être void . Il dit maintenant int mais vous ne retournez rien d'autre que votre programme a vraiment non définie Comportement .

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 et après 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. xxx


2 commentaires

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.



1
votes

En première partie, vous modifiez la valeur num num avec pré-décrément - 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).

Donc, si vous suivez 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>

si vous appelez l'original 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
}


1 commentaires

Ohh, alors c'est pourquoi. Merci beaucoup :))



0
votes

Si vous souhaitez passer num - 1 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) . Rien de fantaisie nécessaire. Ce n'est pas une coïncidence qui est la façon qui fonctionne.

C spécial ++ et - 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 . Donc, - num ne doit pas simplement soustraire 1 à partir de num , il stocke la valeur num - 1 retour dans num . Mais ce n'est pas ce que vous voulez ici. Vous ne souhaitez pas modifier num , car sur chaque appel récursif, vous souhaitez imprimer la valeur de num que vous avez commencé avec, pas la version décrémentée que vous avez transmise dans la récursion.


0 commentaires

-1
votes

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

La pile locale lorsque NATURAL_NUMBERS ( 3) appelé ressemble à xxx


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.

La pile locale pour (NUM-1) sera comme ceci: xxx


0 commentaires