0

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

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

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

编辑:

分析问题后发现异常是因为递归层级超过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;
}

注意:上面的示例代码可能是一个无限循环,因为我只是用它来提到使用了多个递归,它的实际实现不是无限循环。

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

我的问题是,如果使用多个递归,我该如何用迭代替换它。我用谷歌搜索并发现了许多用迭代或库存替换递归的建议。但我没有找到任何关于用迭代替换多重递归的信息。

4

2 回答 2

2

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

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;
}
于 2013-11-14T09:10:02.607 回答
1

好的,所以您只想知道它是否可以解决它:

StackOverflowException是的,如果您切换到循环,您将不会得到 a 。

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

在一个循环中,您不会将越来越多的东西推入堆栈,因此您不会遇到这个问题。然而,实现起来可能不那么直接,否则我们永远不会使用递归。

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

于 2013-10-22T12:42:41.043 回答