#include <iostream>
using namespace std;
int recur(int x) {
1 and recur(--x);
cout << x;
return x;
}
int main() {
recur(10);
return 0;
}
Répondre
1 and recur(--x);
est équivalent à
recur(--x);
vous MANIFESTEMENT Pour faire des appels récursifs infini qui conduit à débordement de pile suivi par erreur de segmentation.
Je suppose que que vous vouliez dire
x and recur(--x);
qui fait l'appel récursif que lorsque x est non nul.
... et d'une manière magnifiquement non-évidente. Préférez le 'si (x <= 0) return 0;' que tzaman a suggéré parce qu'il est plus lisible et est plus sûr dans le cas où le code change plus tard provoque 'x' sauter 0 sur son chemin à l'infini négatif. – msw
C'est une récursion infinie. Donc, il va segmenter faute quand il manque d'espace de pile.
Il ne possède pas de condition de terminaison pour la récursivité et se recurera jusqu'à ce que vous manquiez d'espace de pile.
recur
est une boucle infinie; vous devez mettre une condition de base là-bas afin qu'il cesse de s'appeler.
E.g. (en haut de la fonction) if (x <= 0) return 0;
En outre, quel est le point de la 1 and
? C'est un non-op ... peut-être que vous vouliez dire x and
, qui arrêterait la récursion lorsque x
atteindrait 0
, à condition de n'avoir jamais appelé recur
avec un nombre positif (des valeurs négatives causeraient toujours la boucle infinie).
Les valeurs négatives ne provoqueront pas une boucle infinie, mais vous allez probablement encore souffler votre pile, donc c'est fondamentalement la même chose. –
Une fonction récursive n'est pas __looping, __ elle est __recursing .__ Pour cette raison, il ne s'agit pas d'une boucle __endless, __ mais d'une récursivité __endless .__ – sbi
- 1. Pourquoi ce code provoque-t-il une erreur de segmentation?
- 2. Pourquoi ai-je une erreur de segmentation avec ce code?
- 3. Pourquoi ai-je une erreur de segmentation avec ce code?
- 4. Pourquoi ai-je une erreur de segmentation?
- 5. Erreur de segmentation QPlainTextEdit
- 6. xdrmem_create erreur de segmentation
- 7. "Défaut de segmentation du signal". D'où vient cette erreur?
- 8. Erreur de segmentation SWFTools
- 9. Erreur de segmentation
- 10. Génération de code LLVM entraînant une erreur de segmentation?
- 11. Le code suivant indique une erreur de segmentation
- 12. Pourquoi ai-je une erreur de segmentation dans ce programme?
- 13. c structure erreur de segmentation
- 14. Pourquoi ce programme provoque-t-il une erreur de segmentation?
- 15. erreur de segmentation dans C
- 16. Ruby moniteur erreur de segmentation
- 17. Erreur de segmentation dans getc()
- 18. Erreur de segmentation avec FastDelegate
- 19. Erreur de segmentation PHP mysqli
- 20. Erreur de segmentation avec strcat
- 21. Erreur de segmentation JNI bug
- 22. en utilisant clone(): erreur de segmentation
- 23. Le nom de variable 'xor' entraîne une erreur de segmentation interne 'erreur de segmentation'!
- 24. Erreur de segmentation à l'heure (0);
- 25. Pourquoi ai-je cette erreur dans ce code Python?
- 26. Erreur de segmentation lors de l'entrée différente
- 27. C++ erreur de segmentation de malloc
- 28. Gtk :: MessageDialog Exécute une erreur de segmentation
- 29. Pourquoi ai-je cette erreur?
- 30. Quelle est la cause de cette erreur de segmentation lors de l'utilisation des instructions SSE?
que fait '1 et récurrent (- x);' faire? jamais vu – RvdK
Dépassement de pile? –
@Powe: 'and' est un jeton alternatif pour' && '. La ligne elle-même n'a pas beaucoup de sens (la partie gauche de l'AND est toujours vraie) et pourrait simplement être écrite 'recur (- x)'. Ici, il est évident qu'il n'y a aucun moyen de terminer. @lorb: Pour arrêter la récursion, vous avez besoin d'un cas de base en haut de la fonction pour exister sans un autre appel à lui-même, comme 'if (x == 0) return 0;' Vous pouvez aussi changer '1' en' x', qui arrêtera l'évaluation du côté droit quand x est 0. – GManNickG