2010-05-11 5 views
2
#include <iostream> 
using namespace std; 

int recur(int x) { 
    1 and recur(--x); 
    cout << x; 
    return x; 
} 

int main() { 
    recur(10); 
    return 0; 
} 
+4

que fait '1 et récurrent (- x);' faire? jamais vu – RvdK

+3

Dépassement de pile? –

+1

@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

Répondre

4
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.

+0

... 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

5

C'est une récursion infinie. Donc, il va segmenter faute quand il manque d'espace de pile.

2

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.

2

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).

+0

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. –

+1

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

Questions connexes