Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.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#_Asp.net_Iis_Recursion_Stack Overflow - Fatal编程技术网

C# 递归与循环

C# 递归与循环,c#,asp.net,iis,recursion,stack-overflow,C#,Asp.net,Iis,Recursion,Stack Overflow,我在c#asp.net程序中使用递归函数,它抛出“StackOverflow异常”。在IIS中运行程序时引发此异常 如果我使用循环而不是递归函数,它会抛出“StackOverflow异常”吗 在这种情况下,使用循环或递归哪个好 编辑: 在分析问题之后,我发现异常是由于递归级别超过1000而导致的,它导致堆栈溢出 现在,我完全无法将递归函数转换为迭代,因为使用了多重递归。我在这里发布了一个示例代码供参考: RecursiveFunction(Node n) { //Some Code

我在c#asp.net程序中使用递归函数,它抛出“StackOverflow异常”。在IIS中运行程序时引发此异常

如果我使用循环而不是递归函数,它会抛出“StackOverflow异常”吗

在这种情况下,使用循环或递归哪个好

编辑:

在分析问题之后,我发现异常是由于递归级别超过1000而导致的,它导致堆栈溢出

现在,我完全无法将递归函数转换为迭代,因为使用了多重递归。我在这里发布了一个示例代码供参考:

RecursiveFunction(Node n)    {
   //Some Code for local variables
node.processed=true;
if(n.up){
   //Create a sub node for node below the current one
  if(!subnode.processed)
   RecursiveFunction(subnode);
}
else{
   //Create a sub node for node above current one
 if(!subnode.processed)
   RecursiveFunction(subnode);
}
return result;
}
注意:上面的示例代码可能是一个无限循环,因为我只是用它来说明使用了多个递归,它的实际实现不是一个无限循环

在这种情况下,基本条件是,如果一个节点已经被处理,它将不使用递归并直接返回结果


我的问题是,如果使用多个递归,如何用迭代替换它。我在谷歌上搜索,找到了很多用迭代或股票替换递归的建议。但是我找不到任何关于用迭代替换多重递归的方法。

好的,所以您只想知道它是否能解决这个问题:

是的,如果切换到循环,则不会得到
StackOverflowException

当您调用一个方法时,它会被推送到调用堆栈上。从内部调用相同的方法会建立一个越来越大的堆栈。最终,当程序耗尽堆栈上的所有可用内存时,会弹出一个
StackOverflowException

在一个循环中,您并没有将越来越多的内容推到堆栈中,所以您不会遇到这个问题。然而,实现起来可能不那么直截了当,否则我们永远不会使用递归


正如其他人所提到的,在这种情况下使用递归可能没有什么错,只是你没有在任何时候停止递归。在这种情况下,相同的循环版本将永远持续(但您不会得到StackOverflow!)

好的,所以您只想知道它是否能解决此问题:

是的,如果切换到循环,则不会得到
StackOverflowException

当您调用一个方法时,它会被推送到调用堆栈上。从内部调用相同的方法会建立一个越来越大的堆栈。最终,当程序耗尽堆栈上的所有可用内存时,会弹出一个
StackOverflowException

在一个循环中,您并没有将越来越多的内容推到堆栈中,所以您不会遇到这个问题。然而,实现起来可能不那么直截了当,否则我们永远不会使用递归


正如其他人所提到的,在这种情况下使用递归可能没有什么错,只是你没有在任何时候停止递归。在这种情况下,相同的循环版本将永远持续下去(但不会出现堆栈溢出!)

您可以通过管理自己的堆栈将任何递归函数转换为非递归函数。大概是这样的:

void NonRecursiveFunction(Node n)    {
   var stack = new Stack<Node>();
   stack.Push(n);

   while(stack.Any()) {
        node = stack.Pop();
        //Some Code for local variables
        node.processed=true;
        if(n.up){
            //Create a sub node for node below the current one
            if(!subnode.processed)
                stack.Push(subnode);
        } else{
            //Create a sub node for node above current one
            if(!subnode.processed)
                stack.Push(subnode);
        }
    }
    return result;
}
void非递归函数(节点n){
var stack=新堆栈();
堆栈推送(n);
while(stack.Any()){
node=stack.Pop();
//局部变量的一些代码
node.processed=true;
如果(不适用){
//为当前节点下方的节点创建子节点
如果(!subnode.processed)
堆栈推送(子节点);
}否则{
//为高于当前节点的节点创建子节点
如果(!subnode.processed)
堆栈推送(子节点);
}
}
返回结果;
}

您可以通过管理自己的堆栈将任何递归函数转换为非递归函数。大概是这样的:

void NonRecursiveFunction(Node n)    {
   var stack = new Stack<Node>();
   stack.Push(n);

   while(stack.Any()) {
        node = stack.Pop();
        //Some Code for local variables
        node.processed=true;
        if(n.up){
            //Create a sub node for node below the current one
            if(!subnode.processed)
                stack.Push(subnode);
        } else{
            //Create a sub node for node above current one
            if(!subnode.processed)
                stack.Push(subnode);
        }
    }
    return result;
}
void非递归函数(节点n){
var stack=新堆栈();
堆栈推送(n);
while(stack.Any()){
node=stack.Pop();
//局部变量的一些代码
node.processed=true;
如果(不适用){
//为当前节点下方的节点创建子节点
如果(!subnode.processed)
堆栈推送(子节点);
}否则{
//为高于当前节点的节点创建子节点
如果(!subnode.processed)
堆栈推送(子节点);
}
}
返回结果;
}

是的,通常可以发布代码。抱歉,我不能发布代码,我的疑问是,即使我将递归函数转换为循环,它是否能解决问题(StackOverflow异常)?如果将抛出StackOverflow异常的递归函数转换为命令式循环,它很可能会以无止境循环结束,永远运行。除非您发布一些示例代码,否则这都是推测。我的递归函数不是无限的,只是堆栈大小有限。在visualstudiodevserver中,它可以正常工作。它仅在IIS中导致异常。因此,我认为循环不会是无限的。谢谢大家的快速回复。是的,通常可以发布代码。抱歉,我不能发布代码,我的疑问是,即使我将递归函数转换为循环,它是否能解决问题(StackOverflow异常)?如果将引发StackOverflow异常的递归函数转换为命令循环,很有可能它会在一个无止境的循环中结束,永远运行。除非您发布一些示例代码,否则这都是推测。我的递归函数不是无止境的,只是堆栈大小有限。在visualstudiodevserver中,它可以正常工作。它仅在IIS中导致异常。因此,我认为循环不会是无限的。谢谢你们的快速回复。谢谢你们的快速回复。我试试你的建议。很好的解决办法。谢谢。谢谢你的快速回复。我试试你的建议。很好的解决办法。谢谢你的回答谢谢你的回答