C#递归深度 - 你有多深入

Kei*_*las 49 .net c# recursion stack

有什么控制可以递归调用一些东西吗?

从一个基本的测试程序,我得到一个超过18k的递归深度

这取决于stacksize ....

有没有办法设置一个大块的内存(也许是一个线程)与大量的堆栈,以增加递归深度?

And*_*ich 49

在某些文档识别期间,我增加了堆栈大小.真的需要它.

因此,您可以使用以下代码增加线程的堆栈大小:

var stackSize = 10000000;
Thread thread = new Thread(new ThreadStart(BigRecursion), stackSize);
Run Code Online (Sandbox Code Playgroud)

Thread(ThreadStart,Int32) - 初始化Thread类的新实例,指定线程的最大堆栈大小.

资源

希望这是你需要的.

  • 我真的怀疑这是任何人都需要的.你根本不应该创建像这样的代码,我会解雇一个尝试过的程序员.任何递归算法都可以在不使用递归的情况下实现,有时可以以减少问题顺序的方式实现.这就像一名汽车修理工使用大锤来固定发动机. (9认同)
  • 我找到了第四方;) (8认同)
  • 仅供参考,问题是“可以”,为什么是“为什么”,有多种原因,其中没有一个是可以解雇的罪行:)我认为有时人们过于专注于自己的小泡沫以及他们为实现这一目标所做的努力他们没有考虑人们想用编程语言做的广阔世界。对您应该做什么和不应该做什么有非常强烈的意见通常会限制您的思维。话虽如此,这是大多数人通常不需要的东西,您应该始终评估要做出的权衡 (6认同)
  • 说真的......除非他们是这种实施的例外情况,否则我会对供应商的能力失去信心,并且不愿意依赖他们的产品. (2认同)

Jon*_*ood 21

我想你在这里冒着问题.很难准确确定递归算法将使用多少堆栈.并且,如果你对某些问题是否有足够的问题,我会寻找另一种方法.

大多数递归算法都可以重写为不递归.然后,您可以根据需要分配尽可能多的内存,如果还不够,甚至可以优雅地恢复.

  • +1每个递归算法都可以用循环和堆栈数据结构写成非递归. (18认同)
  • @Byron:感谢您让我记住我在大学里的数据结构课程.教授:"以非递归格式编写这个树遍历程序." 我:"你为什么讨厌我们?" :) (7认同)
  • 我的问题是如何做到这一点,我比想要真正做到更好奇.虽然这是一个很好的建议,但它没有回答提出的问题. (6认同)

Bri*_*sen 5

默认堆栈大小存储在PE头中.

如果你自己生成线程,Thread会有一个构造函数,它将堆栈大小作为参数.

但是,对于大多数任务,默认的.NET堆栈大小应该足够1 MB,因此在更改之前,您至少应该检查该任务.


Mic*_*ick 5

即使您设法获得更大的递归深度,仅出于性能原因,我也会在不使用递归的情况下实现此算法。方法调用比 while 循环中的迭代更昂贵。我强烈建议不要实现任何需要摆弄默认堆栈大小的东西。

我偶尔会使用递归,但仅当调用深度定义为低(如小于 100)时。在创建商业软件时,使用具有无限迭代次数的递归算法是完全不专业的,并且可能会给您带来非常愤怒的客户。