.net-C#遞歸深度-您可以深度到多深

是否有任何控件可以遞歸調用多少內容?

通過基本測試程序,我得到的遞歸深度剛好超過18k

這取決于堆棧大小。

有沒有辦法用大量堆棧設置一塊內存(也許是一個線程)來增加遞歸深度?

asked 2020-02-22T21:58:13Z
4個解決方案
48 votes

在某些文檔識別過程中,我增加了堆棧大小。 確實需要。

因此,您可以使用以下代碼來增加線程的堆棧大小:

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

線程(ThreadStart,Int32)-   初始化的新實例   線程類,指定最大值   線程的堆棧大小。

資源

希望這是您需要的。

answered 2020-02-22T21:58:44Z
21 votes

我認為您在這里冒問題的風險。 很難確切確定遞歸算法將使用多少堆棧。 而且,如果您對是否足夠有疑問,我會尋找另一種方法。

大多數遞歸算法可以重寫為非遞歸算法。 然后,您可以分配所需的內存可以领救济金的游戏,如果內存不足可以领救济金的游戏,甚至可以正常恢復。

answered 2020-02-22T21:59:09Z
5 votes

默認堆棧大小存儲在PE標頭中。

如果您自己生成線程,則Thread的構造函數將堆棧大小作為參數。

但是,默認的.NET堆棧大小1 MB應該足以完成大多數任務,因此,在進行更改之前,至少應檢查一下任務。

answered 2020-02-22T21:59:38Z
3 votes

即使您設法獲得更大的遞歸深度,僅出于性能方面的考慮,我也將實現該算法而無需遞歸。 方法調用比while循環中的迭代昂貴。 我強烈建議您不要實施任何需要擺弄默認堆棧大小的內容。

我偶爾使用遞歸,但僅在定義了呼叫深度且較低(小于100)時才使用遞歸。 在創建商業軟件時可以领救济金的游戏,使用迭代次數不確定的遞歸算法完全是不專業的,并且可能使您非常生氣。

answered 2020-02-22T22:00:03Z
translate from