我该如何处理 System.StackOverflowException?
How can I handle System.StackOverflowException?
这个错误有时只有在我调用一个参数为数字的递归函数时才会出现:rand()%10
。就像下面的代码一样:
private: System::Void AIrandomMove(int randomMove,String ^s)
{
if (randomMove == 1)
{
if ( Move(1) ) // move number 1 had already been done
AIrandomMove(rand()%10,s); // here it appears the System.WhosebugException
else
//do move number 1
}
//same goes for ==2 || ==3 || ... || ==10
}
我该如何处理?
正确的递归算法在两个假设下工作:
- 你有一个终止递归的基本情况(因此函数不会调用自身)
- 你有一个递归案例,它使用不同的参数调用函数本身,因此涉及一些进展
翻译成这样:
void recursive(inArgs) {
if (condition)
return;
else
recursive(outArgs)
}
很明显,如果 condition
是表达式 true
那么这段代码永远不会终止(因此它最终会引发堆栈溢出)。
在您的情况下,condition
是通过随机值比较来评估的。现在,假设条件是 rand()%2 == 0
。所以基本上每次评估时,你都有 50%
成为 true
和 50%
的机会成为 false
.
这并不能保证递归会终止,因为存在 n true
评估的路径(并且可以计算它的概率)。那是你设计的问题。
如果已经做了很多动作(或者可能是所有动作),那么递归将不会结束。
在你的情况下你根本不需要递归,因为你可以将可用的动作存储在一个集合中并在它们不再可用时将它们删除(可能洗牌然后随机选择一个)。或者更简单的解决方案如下:
int choosenMove = rand()%10;
while (Move(choosenMove)) {
choosenMove = rand()%10;
// do move choosenMove
}
但这并不能保证终止,如果你不能确保没有可用移动的状态不会发生的话。
这个错误有时只有在我调用一个参数为数字的递归函数时才会出现:rand()%10
。就像下面的代码一样:
private: System::Void AIrandomMove(int randomMove,String ^s)
{
if (randomMove == 1)
{
if ( Move(1) ) // move number 1 had already been done
AIrandomMove(rand()%10,s); // here it appears the System.WhosebugException
else
//do move number 1
}
//same goes for ==2 || ==3 || ... || ==10
}
我该如何处理?
正确的递归算法在两个假设下工作:
- 你有一个终止递归的基本情况(因此函数不会调用自身)
- 你有一个递归案例,它使用不同的参数调用函数本身,因此涉及一些进展
翻译成这样:
void recursive(inArgs) {
if (condition)
return;
else
recursive(outArgs)
}
很明显,如果 condition
是表达式 true
那么这段代码永远不会终止(因此它最终会引发堆栈溢出)。
在您的情况下,condition
是通过随机值比较来评估的。现在,假设条件是 rand()%2 == 0
。所以基本上每次评估时,你都有 50%
成为 true
和 50%
的机会成为 false
.
这并不能保证递归会终止,因为存在 n true
评估的路径(并且可以计算它的概率)。那是你设计的问题。
如果已经做了很多动作(或者可能是所有动作),那么递归将不会结束。
在你的情况下你根本不需要递归,因为你可以将可用的动作存储在一个集合中并在它们不再可用时将它们删除(可能洗牌然后随机选择一个)。或者更简单的解决方案如下:
int choosenMove = rand()%10;
while (Move(choosenMove)) {
choosenMove = rand()%10;
// do move choosenMove
}
但这并不能保证终止,如果你不能确保没有可用移动的状态不会发生的话。