2016-05-08 17 views
1

を返しません。ここに私のコードです。私はそれが1つずつインクリメントするために5を返すと期待しています。問題は、x> = 5の場合、どのようにして値をメイン関数に戻すことができるかです。ある関数には1つのリターンしかないはずです。C++の再帰は、期待値

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; 
} 

答えて

4

再帰呼び出しからreturnがありません。

は、その行のreturnなけれ

return addup(x); 

によって

addup(x); 

を交換し、機能がちょうど終わりに落ち、そして未定義の動作の対象となるん。

良いコンパイラはifブロックで行方不明return声明を警告します。あなたの元のコードだろう、(Javaなど)いくつかの言語で

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

:あなたはいつも再帰の間に値を返す必要があります

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

-Wallでコンパイルしたとき、私は++グラムから、次の警告を受けます常に値を返すとは限らないため、コンパイラエラーが発生します。あなたのif-elseの両方の流れが良いプラクティスとして値を返す必要がありますけれども、あなたのC++コンパイラでは、これは明らかに、許可されました。

0

さて、あなたは関数呼び出しの基本と考えることができます再帰で、このリターンを持っていることの理由を理解するために/スタックフレーム:私たちは、現在の関数のの直前の呼び出し元に戻す値を渡すためにreturn文必要

コールフレーム。この即時の呼び出し元は、再帰の場合に同じ関数を別の呼び出しにすることができます。

あなたが呼び出される関数の戻り値は、使用されていない(それは再帰的または正常である)場合はどちらかその戻り値は廃棄されるか、または、それは多くの言語でエラーになります。場合によっては、最後の関数呼び出しの戻り値は、現在の関数呼び出しの戻り値として自動的に再利用されます。そのため、未定義の動作が発生することがあり、これを防ぐためのインテリジェントなコンパイラを警告することがありません。

再帰呼び出しが持っている必要があります。

  1. ベースケース:我々は解決策と戻り値を持っているいくつかの条件を。複数の基本事例が存在する可能性があります。

  2. 私たちのベースケースに近づくためのアルゴリズムまたはロジック(つまり、元の問題を簡単な問題に分解する)。

  3. 単純な問題を関数に戻す再帰呼び出し。

したがって、この場合には、お使いのベースの場合は、ロジックは基本ケースに近づくために(X> = 5)であること(X ++)で、再帰呼び出しは、引数xとaddupです。しかしここでは返却値を保存せず、破棄または紛失する可能性があります。したがって、それ以上の問題が発生する可能性があります。したがって、適切に処理する必要があります。 return addup(x);

今は意味があると思います。あなたはreturnを追加するのを忘れ

0

、それがすべてです:

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