程序在使用递归后爆炸

Program blowing up after using recursion

本文关键字:递归 程序      更新时间:2023-10-16

修改reverse a字符串函数以添加递归。不幸的是,我的程序一直在爆炸。

在Visual Studio中逐步执行我的代码,出于某种原因,监视窗口会说i等于字符串的长度(即退出while循环的终止条件)。我最后一次跨过它,它说我现在比绳子的长度少了一个。然后它就永远停留在while循环中。

我知道这听起来令人困惑,所以我将举一个例子。我输入"海绵宝宝",它会做我想做的一切(即说海绵宝宝的长度是9,打印"bobegnopS",将I增加到字符串长度,等等),但后来它说我现在是8(即它刚刚是9),并且从未退出while循环。

这是我的ReverseString()函数:

void ReverseString(char * string, bool stringReversed, int stringLength, int i)
{
    i++;
    if(!stringReversed)
    {
        while(*string != '')
        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);
    }

当您编写递归函数时,您总是需要指定停止的条件。想象一下,您想要编写天真的阶乘递归实现。所以我们的想法是这样计算:

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

您是否需要返回值这一事实并不能改变您需要设置停止条件的事实,否则您的递归函数将永远不会停止。

void ReverseString(char * string, bool stringReversed, int stringLength, int i)
{
  ...
  while(i < stringLength)
  {
    string--;
    std::cout << *string;
    ReverseString(string, stringReversed, stringLength, i);
  }
}

循环中没有任何内容修改istringLength(函数ReverseString通过值而不是引用获取它们。)因此它永远不会终止。