-3

このコードの何が問題になっていますか? これは私がやっていることの単純化されたバージョンです。これは、同じ変数に対する再帰関数呼び出しです。

#include <iostream>

using namespace std;
void Foo(int& x)
{
    x++;
    Foo(x);
    cout<<x<<"\n";
    if(x==10)
        return;
}

int main()
{
    int x=0;
    Foo(x);
    return 0;
}
4

3 に答える 3

3

この関数には終了条件がありません。無条件に自分自身を呼び出し、無限再帰を設定しようとします。

void Foo(int& x)
{
    x++;
    Foo(x); // <==== UNCONDITIONALLY RECURSIVE
    cout<<x<<"\n";
    if(x==10)
        return;
}

各関数呼び出しのスタック フレームはある程度のメモリ スペースを必要とするため、無限再帰は不可能です。遅かれ早かれ、スタックはその制限サイズを超えて大きくなり、プログラムは強制的に終了されます。

于 2013-03-03T22:59:52.037 に答える
3
x++;
Foo(x);
cout<<x<<"\n";
if(x==10)
    return;

問題は、これにより無限再帰が発生することです。if (x == 10) 関数がそれ自体を呼び出した後にのみチェックするため、戻り条件に到達することはできません。書き込んでこれを修正します

x++;
if(x==10)
    return;

Foo(x);
cout<<x<<"\n";
于 2013-03-03T23:00:53.133 に答える
1

無限再帰があります。スタック スペースがなくなるまでスタック フレームを作成し続けます。再帰呼び出しの前に出口ガードが必要です。

void Foo(int& x)
{
    cout<<x<<"\n";
    if(x==10)
        return;
    x++;
    Foo(x);
}
于 2013-03-03T23:02:50.857 に答える