對於C#AI程序,我使用遞歸調用來查找最佳下一步移動(使用30x30數組來存儲當前板狀態)。對於我所做的每一個動作,我想看看我可以從新棋盤狀態中做出哪些可能的動作是最好的...等等,直到我達到「遊戲結束」的位置(在這個位置沒有進一步的移動狀態),或者一個計時器停止進程並且不進行進一步的遞歸調用(並且返回「最佳」已知位置)。這只是爲了解釋爲什麼我必須使用遞歸(它不是尾遞歸),我不能使用單個(全局)板狀態,但必須從當前狀態搜索所有可能的板狀態。有沒有辦法在遞歸調用之前檢查可用的堆棧大小? (C#)
(有時)我得到一個System.StackOverflowException。有沒有辦法在下次遞歸調用之前檢查可用堆棧空間?然後,我可以將當前狀態作爲「到目前爲止找到的最佳位置」返回,而不進行下一次遞歸調用。即當可用堆棧變得太小時,它也應該算作基本情況。
當然,其他選項可能只是將每個遞歸調用放在try..catch塊中,並通過將它用作基本大小寫來處理System.StackOverflowException?
重新設計你的代碼?一個stackoverflow是一個錯誤或錯誤(C#)代碼的標誌。您需要瘋狂的遞歸調用來觸發一個計算器。如果您真的想這樣做,請使用支持尾巴呼叫的功能語言,如F#。 C#不是爲它設計的。 – Dykam
「如果您正在調用遞歸方法或計劃使用大量堆棧空間,則必須使用RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup方法。」 - (http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.runtimehelpers.probeforsufficientstack.aspx – DavidO