2009-03-17 5 views
4

Ich habe ein sehr einfaches Programm erstellt, das Rekursion verwendet. Ich benutze den g ++ Compiler. Ich kann es kompilieren, aber wenn ich versuche, es auszuführen, erhalte ich eine Fehlermeldung, die SEGMENTATION FAULT sagt. Hier ist mein Code:G ++ Compiler wird keine Rekursion erlauben?

#include <iostream.h> 
using namespace std; 

int Recurse(int); 

int main(int argc, char *argv[]) 
{ 
     Recurse(10); 
     cout << endl; 
} 

int Recurse(int numTimes) 
{ 
    if (numTimes == 0) 
     return 0; 
    else 
     { 
       cout << numTimes << " "; 
     Recurse(numTimes--); 
     } 
} 

Antwort

33

In Ihrem rekursiven Aufruf verwenden Sie den Postfix -- (numTimes--) anstelle der Präfixversion (--numTimes). Als Ergebnis wird der Wert numTimes nach dem rekursiven Aufruf dekrementiert. Dies bedeutet, dass Recurse mit 10 unendlich aufgerufen wird. Verwenden Sie die Präfixversion (die sie vor dem Aufruf dekrementiert) oder übergeben Sie einfach numTimes-1 (da der Wert numTimes nicht geändert werden muss).

Der Grund dafür, dass Sie einen Segfault sehen, besteht darin, dass Ihr Stack in den geschützten Speicher überläuft.

+0

+1 für die Notierung eines Stack-Overflow UND Vorschlag mit x-1 anstelle von x--. – strager

5

Es könnte die "numTimes--" sein, die die unendliche Rekursion verursacht. Der Postfix - dekrementiert den Wert innerhalb der - Methode, gibt aber den ursprünglichen Wert der Variablen zurück.

Versuchen Sie es in --numTimes zu ändern.

3

Sie erhöhen numTimes, nachdem Sie es an Recurse() übergeben haben, also blenden Sie den Stapel ein, indem Sie ständig in Recurse mit dem Wert 10 rekursiv arbeiten und nie etwas an cout ausgeben.

+0

Hey, ein Stapelüberlauf auf Stackoverflow :) –

3

Erstens wollen Sie

#include <iostream> 

Ohne die .h

nun für das Programm verwenden:

#include <iostream> 
using namespace std; 

int Recurse(int); 

int main(int argc, char *argv[]) { 
     Recurse(10); 
     cout << endl; 
} 

int Recurse(int numTimes) { 
    if (numTimes == 0) 
     return 0; 
    else { 
     cout << numTimes << " "; 
     return Recurse(--numTimes); 
    } 
} 

Sie müssen die anzuwenden - 1 vor der Auswertung.

Verwandte Themen