我有一个像这样的简单方法:
public int method(int a)
{
if(// something)
{
methode(a);
}
else return 0;
}
当调用深度增加时,Visual Studio会抛出 stackoverflow exeption。
我该如何解决这个问题? 有没有办法手动保存返回地址和本地数据并实现自定义堆栈??
我应该注意,我不想将我的方法更改为非递归类型。
答案 0 :(得分:3)
是的,在C#中(可能在Java等中)有一个Stack<T> class。对于您的方法,您只需创建一个Stack并将参数存储在那里。迭代堆栈,直到它为空。
虽然这引入了迭代循环,但您的算法仍然是递归的。 (也就是说,首先是深度而不是先宽度)
当然,您需要确保您的算法最终终止。这只是一种将堆栈空间增加到操作系统提供的空间的方法。 Windows为每个进程分配一定量的堆栈空间,足以满足大多数应用程序的需要。如果需要更多,可以在堆上实现自己的堆栈式数据结构。堆通常受可用RAM和应用程序“位数”的限制。
答案 1 :(得分:1)
我该如何解决这个问题?有没有办法保存退货地址 手动和本地数据并实现自定义堆栈??
递归方法应该有终止点,其中返回结果。
答案 2 :(得分:0)
您需要减少递归的深度。
答案 3 :(得分:0)
public int method(int a ){
//do stuff
var something = ... //you have to make sure something turns false at some point
if(something){
method(a);
}
}
答案 4 :(得分:0)
#define MAX 1000
#include <iostream>
using namespace std;
int methode(int a ){
if(a>0 && a<MAX) return methode(a);
return 0 ;
}// end
int main(void){
methode(1);
cout<<" \nPress any key to continue\n";
cin.ignore();
cin.get();
return 0;
}