Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 递归方法导致堆栈溢出_C# - Fatal编程技术网

C# 递归方法导致堆栈溢出

C# 递归方法导致堆栈溢出,c#,C#,我有这样一个简单的方法: public int method(int a) { if(// something) { methode(a); } else return 0; } 当调用深度增加时,VisualStudio抛出一个堆栈溢出验证。 我怎样才能解决这个问题? 有没有办法手动保存返回地址和本地数据并实现自定义堆栈 我应该注意,我不想将我的方法更改为非递归类型。是的,在C#(可能在Java等语言中)中有一个。对于您的方法,您可

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

public int method(int a) 
{    
    if(// something)
    {
        methode(a); 
    }
    else return 0;
}
当调用深度增加时,VisualStudio抛出一个堆栈溢出验证。

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

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

是的,在C#(可能在Java等语言中)中有一个。对于您的方法,您可以简单地创建一个堆栈并将参数存储在那里。在堆栈上迭代,直到堆栈为空

虽然这引入了一个迭代循环,但您的算法仍然是递归的。(即深度优先,而不是广度优先)


当然,您需要确保您的算法最终终止。这只是一种将堆栈空间增加到操作系统提供的空间之上的方法。Windows为每个进程分配一定数量的堆栈空间,足以满足大多数应用程序的需要。如果需要更多,可以在堆上实现自己的类似堆栈的数据结构。堆通常受到可用RAM和应用程序“位”的限制。

您需要减少递归的深度

我怎样才能解决这个问题?有没有办法保存回信地址 手动和本地数据并实现自定义堆栈

递归方法应该有一个终止点,在这里返回from result。

就像Dunken说的那样——“你必须确保某些东西在某个点变为false”

public int method(int a ){
//do stuff
  var something = ... //you have to make sure something turns false at some point
  if(something){ 
    method(a);
  }  
}
#定义最大1000
#包括
使用名称空间std;
int方法(INTA){

如果(a>0&&a请为您的语言选择一个标记,而不是全部或全部删除,然后添加
语言不可知的
。您忘记标记Python。我们需要更多代码。引发异常是因为它陷入了一个无休止的循环。这应该只使用while循环来完成。因此,您的代码和/或您对函数应该如何运行的想法是什么是有缺陷的。给我们看一点代码和细节,你想实现什么。你不认为你应该做一些事情来阻止你的代码很可能是你的代码>如果< /COD>条件从来没有评估到<代码> false <代码>。你能告诉我们什么是<代码>如果< /COD>条件是什么?但是为什么C++中的C问题?
#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;
}