有没有办法在递归调用之前检查可用的堆栈大小?(C#)

Cha*_*uyt 9 c# stack-overflow recursion stack artificial-intelligence

对于C#AI程序,我使用递归调用来查找最佳的下一步(使用30x30阵列来存储当前的板状态).对于我所做的每一个动作,我想看看我可以从新的棋盘状态中做出哪些可能的动作将是最好的...依此类推,直到我达到"游戏结束"的位置(此时无法进一步移动)状态)或计时器停止进程并且不再进行进一步的递归调用(并且返回"最佳"已知位置).这只是为了解释为什么我必须使用递归(它不是尾递归)而且我不能使用单个(全局)电路板状态,但必须从当前状态搜索所有电路板状态.

(有时)我得到一个System.StackOverflowException.有没有办法在下一次递归调用之前检查可用的堆栈空间?然后我可以将当​​前状态作为"到目前为止找到的最佳位置"返回,而不是进行下一次递归调用.即,当可用堆栈变得太小时,它也应该算作基本情况.

当然,另一个选择可能是将每个递归调用放在try..catch块中并使用它作为基本情况来处理System.StackOverflowException?

Joã*_*elo 2

如果你真的想走这条路,你可以使用EnsureSufficientExecutionstack方法。

正如其他人指出的那样,从 .NET 2.0 开始,您无法捕获StackOverflowException,但是,从 MSDN 文档中您知道以前的方法具有以下行为:

确保剩余堆栈空间足够大,可以执行一般的 .NET Framework 函数。

当根据此方法堆栈不够大时,它将抛出一个可以捕获的InsufficientExecutionStackException异常。