0

逆文字列関数を変更して再帰を追加します。残念ながら、私のプログラムは爆発し続けています。

Visual Studio でコードを実行すると、何らかの理由でウォッチ ウィンドウに i が文字列の長さに等しいと表示されます (つまり、while ループを終了するための終了条件)。最後にもう 1 度踏み込むと、文字列の長さよりも 1 つ小さいと表示されます。その後、永久に while ループにとどまります。

これは紛らわしいと思うので、例を挙げます。「Spongebob」と入力すると、必要なことはすべて実行されます (つまり、Spongebob の長さが 9 であると表示され、「bobegnopS」と出力され、文字列の長さに i がインクリメントされるなど)、その後、i が現在 8 であると表示されます (つまり、ちょうど 9) であり、while ループを終了することはありません。

ここに私の ReverseString() 関数があります:

void ReverseString(char * string, bool stringReversed, int stringLength, int i)
{
    i++;
    if(!stringReversed)
    {
        while(*string != '\0')
        string++;
    }
    stringReversed = true;

    while(i < stringLength)
    {
        string--;
        std::cout << *string;
        ReverseString(string, stringReversed, stringLength, i);
    }
   }    

呼び出しは次のとおりです。

    case 3:
    //Learn By Doing 16.6
    {
        char string[BUFFER_LENGTH];
        bool stringReversed = false;

        int base = 0;
        int exponent = 0;

        std::cout << "\nEnter base: " << std::endl;
        std::cin >> base;

        std::cout << "\nEnter exponent: " << std::endl;
        std::cin >> exponent;

        //Print pow
        NewLine();
        std::cout << base << " to the " << exponent << " is " << pow(base, exponent);

        //Reverse string using recursion
        std::cout << "\nEnter string: " << std::endl;
        std::cin >> string;


        NewLine();
        int stringLength = strlen(string);
        int i = 0;
        ReverseString(string, stringReversed, stringLength, i);

    }
4

2 に答える 2

3

再帰関数を書くときは、いつ停止するかという条件を常に指定する必要があります。単純な階乗再帰実装を書きたいと想像してください。したがって、アイデアは次のように計算することです。

n! = n * (n-1) *...*2*1

シーケンスを調べると、値 1 で停止する必要があることがわかります。単純な再帰的な実装は次のようになります。

int factorial( int n )
{
   // stop when we reached 1
   // otherwise we never finish
   if( n == 1 ) return 1; 
   // now do the magic
   return n * factorial( n - 1 );
}

値を返す必要があるかどうかは、停止条件を設定する必要があるという事実を変更しません。そうしないと、再帰関数は停止しません。

于 2013-02-23T04:58:35.630 に答える
1
void ReverseString(char * string, bool stringReversed, int stringLength, int i)
{
  ...
  while(i < stringLength)
  {
    string--;
    std::cout << *string;
    ReverseString(string, stringReversed, stringLength, i);
  }
}

ループ内では何も or を変更しませんi(stringLength関数ReverseStringは参照ではなく値で取得します)。

于 2013-02-23T04:53:12.093 に答える