修改我的反向字符串函数以添加递归。不幸的是,我的程序不断爆炸。
在Visual Studio中逐步浏览我的代码,由于某种原因,监视窗口会说i等于字符串的长度(即退出while循环的终止条件)。我最后一次跨过它,它说我现在比字符串长度少一个。然后它永远停留在while循环中。
我知道这听起来令人困惑,所以我举一个例子。我输入“Spongebob”并且它完成我想要的所有内容(即说海绵宝宝的长度是9,打印“bobegnopS”,将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);
}
答案 0 :(得分: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 );
}
您需要返回值的事实并不会改变您需要设置停止条件的事实,否则您的递归函数将永远不会停止。
答案 1 :(得分:1)
void ReverseString(char * string, bool stringReversed, int stringLength, int i)
{
...
while(i < stringLength)
{
string--;
std::cout << *string;
ReverseString(string, stringReversed, stringLength, i);
}
}
循环内部没有任何内容修改i
或stringLength
(函数ReverseString
按值取值,而不是引用。)因此它永远不会终止。