【发布时间】:2012-09-02 15:54:14
【问题描述】:
对于 C# AI 程序,我使用递归调用来寻找最佳下一步行动(使用 30x30 数组来存储当前棋盘状态)。对于我所做的每一步,我想看看我可以从新的棋盘状态中做出的哪些可能的移动是最好的......等等,直到我到达“游戏结束”的位置(在那个位置上没有进一步的移动可能)状态)或计时器停止该过程并且不再进行递归调用(并且返回“最佳”已知位置)。这只是为了解释为什么我必须使用递归(它不是尾递归)并且我不能使用单个(全局)棋盘状态,而是必须从当前状态中搜索所有可能的棋盘状态。
(有时)我得到一个 System.StackOverflowException。有没有办法在下一次递归调用之前检查可用的堆栈空间?然后我可以将当前状态作为“迄今为止找到的最佳位置”返回,而不是进行下一次递归调用。 IE。当可用堆栈变得太小时,它也应该算作基本情况。
当然,另一种选择可能是将每个递归调用放在 try..catch 块中,并通过使用它作为基本情况来处理 System.StackOverflowException?
【问题讨论】:
-
重新设计你的代码? stackoverflow 是错误或错误 (C#) 代码的标志。您需要大量的递归调用来触发 stackoverflow。如果您真的想这样做,请使用支持尾调用的函数式语言,例如 F#。 C# 不是为它设计的。
-
"如果您正在调用递归方法或计划使用大量堆栈空间,则必须使用 RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup 方法。" -- msdn.microsoft.com/en-us/library/…
标签: c# recursion stack artificial-intelligence stack-overflow