2010-12-22 29 views
33

是否有任何控制你可以递归地调用一些东西?C#递归深度 - 你可以走多深

从基本的测试程序中,我得到的刚刚超过18K

取决于堆栈大小递归深度....

有没有办法来设置的内存块(可能是一个线程)与一个巨大的堆栈增加递归深度?

+0

可能的重复[如何更改托管executable.net的默认堆栈大小](http://stackoverflow.com/questions/1042345/how-do-you-change-default-stack-size-for-managed -executable-net) – 2010-12-22 20:34:46

+1

无限深。或者至少在支持尾部呼叫的语言中。 – Juliet 2010-12-22 20:39:41

+6

<初始参考>深度3级... 2010-12-22 20:42:36

回答

40

我在某些文档识别过程中增加了堆栈大小。这真的很需要。

所以,你可以使用下面的代码增加堆栈大小螺纹:

var stackSize = 10000000; 
Thread thread = new Thread(new ThreadStart(BigRecursion), stackSize); 

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

Source

希望这你所需要的。

5

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

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

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

16

我认为你冒这里的风险。很难确定递归算法将使用多少堆栈。而且,如果你对于是否有足够的问题存在疑问,我会寻找另一种方法。

大多数递归算法可以被重写为不递归。然后,您可以根据需要分配尽可能多的内存,如果没有足够的内存,也可以优雅地恢复。

2

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

我偶尔会使用递归,但只有在定义调用深度和低(如小于100)时。在创建商业软件时,使用迭代次数不确定的递归算法是完全不专业的,可能会给你非常愤怒的客户。