递归方法导致stackoverflow

时间:2013-10-07 07:19:48

标签: c#

我有一个像这样的简单方法:

public int method(int a) 
{    
    if(// something)
    {
        methode(a); 
    }
    else return 0;
}

当调用深度增加时,Visual Studio会抛出 stackoverflow exeption。

我该如何解决这个问题? 有没有办法手动保存返回地址和本地数据并实现自定义堆栈??

我应该注意,我不想将我的方法更改为非递归类型。

5 个答案:

答案 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;
}