0
votes

Flux de récursivité dans la langue C et comment la sortie est imprimée

Comment la valeur de je suis imprimée?

Je sais que la récursion appelle elle-même encore et encore. Selon moi, la fonction devrait revenir vide car la fonction est appelée avant impression. Comment est le printf fonctionne? xxx

peut-il expliquer comment fonctionne-t-il?


5 commentaires

Ma meilleure suggestion est de déboguer votre code sur papier écrit également la «pile d'appels» (vous comprenez donc exactement ce qu'il fait). Une explication écrite ne sera pas aussi effective que par vous-même.


Votre code n'est pas valide C et je doute qu'il s'agisse du code qui produisait la sortie, il est au moins manquant \ n à la chaîne de format Printf, alors veuillez toujours publier exemple de reproductible minimal et des choses cohérentes.


Eh bien, vous devez ajouter un #include et inclure un autre renvoyer 0; (et ignorez les avertissements par défaut sur int . .)


Mon professeur d'algorithmes a toujours dit de ne pas essayer de "déboguer" le code sur papier, car il peut fonctionner dans de petits exemples, mais les grands exemples de récursions conduiraient à une "panne mentale". Tant que vous avez une condition d'arrêt, une condition de récursion et votre retour, vous devriez être capable de le déboguer et de voir que la valeur change


La règle Int implicite a été supprimée de la langue C environ 20 ans.


6 Réponses :


0
votes

Lorsque vous appelez recur (2); , alors à ce stade xxx

recur (1) est appelé, puis Quand il atteint à nouveau ce point, recur (0); est à nouveau appelé à nouveau, recur (-1); est appelé. Le recur (-1); rappelle immédiatement renvoie immédiatement parce que si (i <0) retour 0; .

Le recur (0) ; appel, où i est maintenant -1 , puis est l'impression et renvoie (il renvoie recur (- i); Encore une fois, mais c'est -2 à ce stade). Ensuite, le recur (1) appel (où i est 0 maintenant) fait son empreinte, et celui-ci frappe également recur ( 1) , qui retourne.

enfin, l'original recur (2); appel (où i est 1) et appelle un autre recur (0); , lequel comme nous l'avons vu, entraîne des résultats -1 étant imprimés. Il en résulte la sortie de -101-1 ou si vous ajoutez une nouvelle ligne à chaque impression, la sortie que vous voyez.

sur une note latérale, je suggère d'écrire Votre fonction principale comme xxx

et modifier la signature de recur (int i) à vide recur (int i) et son retour 0; à juste retour; .

Selon moi, la fonction doit revenir vide car la fonction est appelé avant impression. Comment le PrintF travaille-t-il?

Pour résumer, cela fonctionne car tous les appels récursifs font d'autres appels récursifs. Ils ne font que des appels récursifs dans certaines conditions, et s'ils ne font pas cet appel récursif, ils se terminent à un moment donné, permettant ainsi la fonction qui l'appelait pour continuer.


0 commentaires

0
votes

Le problème est que vous appelez votre fonction avant d'imprimer la valeur.

recur(int i)
{
if(i<0)
    return 0;
recur(--i);
printf("%d",i);
recur(--i);
}


0 commentaires

0
votes

Lorsque la fonction est appelée avec un argument x > = code> zéro, vous aurez ces lignes exécutées: xxx pré>

lorsque la fonction est appelée avec un argument X zéro, vous n'aurez que cette ligne exécutée: p> xxx pré>

maintenant si vous écrivez les appels de fonction avec une indentation pour chaque niveau d'appel que vous avez Obtenez: P>

-1
0
1
-1


0 commentaires

1
votes

Comprendre ce qui se passe, vous devez comprendre comment les travaux de récursivité. Chaque fonction récursive nécessite une condition de test pour casser la récursion et un appel récursif. Vous avez si (i comme condition de test, puis vous avez deux appels récursifs avec printf code> entre eux.

alors comment ça marche? strong> p>

Vous pouvez penser à la récursion et à la liquidation jusqu'à ce que la condition de sortie soit déclenchée - puis un déroulement comme retour des appels récursifs. Voyons comment cela fonctionne ici. P>

la récursion forte> p>

Lorsque vous commencez par recur (2) code> dans code>, quel chemin la logique prend-elle à la fin de la condition de sortie? p>

Si vous simplifiez la fonction et concentrez-vous sur ce qui se passe avant que votre condition de test soit remplie, vous obtenez quelque chose de similaire à: P>

    printf("%d\n", i);
    recur (--i);


0 commentaires

0
votes

considère également

Vous utilisez la variable est en tant que variable automatique La valeur des variables automatiques est limitée avec la panathèse de sorte que le programme imprimera la valeur de I disponible dans le paranthésie à laquelle réside le flux de contrôle réside contre


0 commentaires

0
votes

au lieu de faire recur (- i) , veuillez faire recur (I-1)

avec - i il diminuera réellement i , et donc dans la version ultérieure printf il sera visible (incorrectement).

pour par exemple. Si i est 0 et que vous faites recur (- i) , il diminuera la valeur réelle du i à -1 puis appelez recur () . Et le printf imprimera -1 ultérieurement.

avec recur (I-1) et i comme 0 Il sera appelé avec -1 comme argument mais la valeur réelle du i ne sera pas modifiée.


0 commentaires