0

再帰のみ(ループなし)を使用して定規を設計する必要がありました。ユーザーは、定規の長さと目盛りの深さ(高さ)を入力します。単純なforループとwhileループを使用してこれをうまく構築できましたが、再帰に変換しようとすると、問題が発生します。ファイルの実行の最後にスタックオーバーフローと最初のチャンスの例外が発生しますが、エラーによってファイルが強制終了される直前に、正しい出力が得られます。私はテストケースの長さ:4と深さ:5、長さ:12と深さ:3を使用しています。

私がどれだけ私の再帰的な努力を台無しにしたかについて誰かが知っているなら、私はすべての耳です。

#include <iostream>
#include <string>

using namespace std;
void solve (int, int, int, string, int);

int main()
{
    int depth, length;
    cout << "Enter a ruler length: ";
    cin >> length;
    cout << endl << "Enter a marking depth: ";
    cin >> depth;

    int i = 0;
    string ruler = "";
    int size = length * pow(2, (depth-1));

    solve(length, depth, i, ruler, size);


    int x;
    cin >> x;

    return 0;
}

void solve (int length, int depth, int i, string ruler, int size)
{
    if (depth > 0)
    {

        int inc = pow(2, depth-1);

        if (i <= (size))
        {   
            if (i % inc == 0) {
                cout << "|";
            }

            if (i % inc != 0) {
                cout << " ";                
            }

            solve (length, depth, ++i, ruler, size);


        }
        cout << "\n";

    }

    solve (length, depth-1, 0, ruler, size);    
}
4

1 に答える 1

2

solve次のような再帰関数からのリターンポイントが必要です。

void solve (int length, int depth, int i, string ruler, int size)
{

    if (depth > 0)
    {
        int inc = pow(2, depth-1);

        if (i <= (size))
        {   
            if (i % inc == 0) {
                cout << "|";
            }

            if (i % inc != 0) {
                cout << " ";                
            }

            solve (length, depth, ++i, ruler, size);
        }
        cout << "\n";            
    }
    else
    {
         return; //<<<---- return out  
    }

    solve (length, depth-1, 0, ruler, size);    
}
于 2013-02-03T03:40:43.937 に答える