有时仅在我调用其中一个参数为数字的递归函数时才会出现此错误: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.StackOverflowException
else
//do move number 1
}
//same goes for ==2 || ==3 || ... || ==10
}
我该如何处理?
答案 0 :(得分:0)
正确的递归算法在两个假设下工作:
这意味着:
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
}
但是,如果您不确定没有移动的状态是否会发生,这并不能保证终止。