2016-05-08 15 views
1

Hier ist mein Code. Ich erwarte, dass es 5 wegen der inkrementellen um eins zurückgibt. Das Problem ist, wenn x> = 5, wie kann ich dann den Wert an die Hauptfunktion zurückgeben? In einer Funktion sollte nur 1 zurückgegeben werden.C++ Rekursion liefert keinen erwarteten Wert

int addup(int x) 
{ 
    if (x < 5) 
    { 
     std::cout<< x++; 
     addup(x); 
    } 
    else return x; 
} 

int main() 
{ 
    using namespace std; 
    int x = 0; 
    cout << "And x is:" << addup(x) << endl; 

    cin.clear(); 
    cin.ignore(32767, '\n'); 
    cin.get(); 
    return 0; 
} 

Antwort

4

Ihnen fehlt ein return aus dem rekursiven Aufruf.

Ersetzen

addup(x); 

von

return addup(x); 

Ohne die return in dieser Zeile, wird die Funktion fällt nur am Ende ab und ist zu undefinierten Verhalten unterliegt. Ein guter Compiler warnt Sie vor der fehlenden return Anweisung im if Block. Wenn mit -Wall zusammengestellt, erhalte ich die folgende Warnung von g ++:

socc.cc: In function ‘int addup(int)’: 
socc.cc:11:1: warning: control reaches end of non-void function [-Wreturn-type] 
} 
2

Sie sollten immer einen Wert während der Rekursion zurück:

int addup(int x) 
{ 
    if (x < 5) 
    { 
     std::cout << x++; 
     return addup(x); 
    } 
    else return x; 
} 

In einigen Sprachen (wie Java), Ihr Original-Code würde führt zu einem Compilerfehler, da dieser nicht immer einen Wert zurückgibt. In Ihrem C++ - Compiler war dies anscheinend erlaubt, obwohl beide Flüsse Ihrer if-else einen Wert als gute Praxis zurückgeben sollten.

0

Nun, zu verstehen, den Grund für diese Rückkehr in Rekursion mit Ihnen von Grundlagen der Funktionsaufruf denken kann/Stack-Rahmen:

Wir brauchen Anweisungen geben einen Wert zurück an den unmittelbaren Aufrufer der aktuellen Funktion des passieren Anruf-Frame. Dieser unmittelbare Aufrufer kann ein anderer Aufruf derselben Funktion im Falle von Rekursionen sein.

Wenn der Rückgabewert einer aufgerufenen Funktion (sei es rekursiv oder normal) nicht verwendet wird, wird dieser Rückgabewert entweder verworfen oder in vielen Sprachen als Fehler angezeigt. In einigen Fällen wird der Rückgabewert des letzten Funktionsaufrufs automatisch als Rückgabewert des aktuellen Funktionsaufrufs verwendet. Aus diesem Grund können Sie undefiniertes Verhalten sehen und verhindern, dass einige intelligente Compiler davor warnen.

Rekursion Anrufe sollten:

  1. Basisfall: Irgend eine Bedingung für die wir eine Lösung und einen Rückgabewert haben. Es kann mehrere Basisfälle geben.

  2. Algorithmus oder Logik, um näher zu unserem Grundfall zu kommen (d. H. Das ursprüngliche Problem zum einfacheren Problem zu zerlegen).

  3. Rekursiver Aufruf, der das einfachere Problem wieder in die Funktion übergibt.

So in diesem Fall Ihr Basisfall (x> = 5), Logik näher an den Basisfall zu bekommen, ist (x ++) und rekursiven Aufruf ist addup mit dem Argumente x.Aber Sie speichern hier nicht den Rückgabewert, der verworfen oder verloren gehen kann und somit weitere Probleme verursachen kann. Daher sollte dieser korrekt behandelt werden als: return addup (x);

Ich hoffe, es macht jetzt Sinn.

0

Sie haben vergessen, eine return hinzufügen, das ist alles:

... 
if (x < 5) 
{ 
    std::cout<< x++; 
    return addup(x); 
// ^^^^^^ 
} 
... 
Verwandte Themen