我该如何处理System.StackOverflowException?

时间:2016-01-12 00:36:36

标签: random stack c++-cli overflow system

有时仅在我调用其中一个参数为数字的递归函数时才会出现此错误: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
}

我该如何处理?

1 个答案:

答案 0 :(得分:0)

正确的递归算法在两个假设下工作:

  • 你有一个终止递归的基本案例(所以函数不会调用自己)
  • 你有一个递归的情况,它用不同的参数调用函数本身,以便有一些进展

这意味着:

void recursive(inArgs) {
  if (condition)
    return;
  else
    recursive(outArgs)
}

很明显,如果condition是表达式true,则此代码永远不会终止(因此最终会引发堆栈溢出)。

在您的情况下,condition通过随机值比较进行评估。现在,假设条件为rand()%2 == 0。所以基本上每次评估你都有50% true50%成为false的可能性。

这并不能保证递归将终止,因为存在具有n true评估的路径(并且可以计算概率)。这就是你设计的问题。

如果已经做了很多动作(或者可能全部动作)那么递归就不会结束。

在你的情况下根本不需要递归,因为你可以将可用的移动存储在一个集合中,并在它们不再可用时删除它们(可能将设备随机移动然后随机选择一个)。或者更简单的解决方案就是:

int choosenMove = rand()%10;

while (Move(choosenMove)) {
  choosenMove = rand()%10;
  // do move choosenMove
}

但是,如果您不确定没有移动的状态是否会发生,这并不能保证终止。