程序在使用递归后爆炸
Program blowing up after using recursion
修改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);
}
}
循环中没有任何内容修改i
或stringLength
(函数ReverseString
通过值而不是引用获取它们。)因此它永远不会终止。
相关文章:
- 是否总是可以将使用递归编写的程序重写为不使用递归的程序C++,性能观点是什么?
- 递归程序的执行流程
- 递归程序获得勒让德多项式
- 当有 2 个或更多递归函数写入 togeather 时,程序如何执行?
- 递归导致程序崩溃,但 while 循环中的相同概念不是来自C++析构函数
- 这个简单的程序如何不表示递归?
- 执行递归函数时 C++ 应用程序崩溃
- 如何理解哪个递归函数程序需要
- 以下递归程序的最后一行是如何工作的
- 如何使用mongocxx c ++驱动程序递归生成Mongodb文档?
- 如何计算递归程序的步骤
- C++回文创建者递归程序
- 多线程递归程序 c++
- 将我的二叉搜索程序改进为递归程序
- 为什么我在计算帕斯卡三角形元素时在递归 C 程序中出现堆栈溢出错误
- 如何使C++递归程序终止
- 基本递归程序中的Bug,可以看出问题所在吗
- c递归程序问题
- 这个在c++中查找阶乘的递归程序背后的逻辑是什么?
- 需要帮助我的递归程序来反转输入