Random 如何处理System.StackOverflowException?

Random 如何处理System.StackOverflowException?,random,stack,c++-cli,overflow,system,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

只有在调用递归函数(其中一个参数是数字)时,才会出现此错误:
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
}

如何处理这个问题?

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

  • 您有一个终止递归的基本情况(因此函数不调用自身)
  • 您有一个递归案例,它使用不同的参数调用函数本身,因此涉及到一些进程
这可以理解为:

void recursive(inArgs) {
  if (condition)
    return;
  else
    recursive(outArgs)
}
int choosenMove = rand()%10;

while (Move(choosenMove)) {
  choosenMove = rand()%10;
  // do move choosenMove
}
很明显,如果
condition
是表达式
true
,那么该代码永远不会终止(因此它最终会引发堆栈溢出)

在您的情况下,
条件
通过随机值比较进行评估。现在,假设条件是
rand()%2==0
。因此,基本上每次对其进行评估时,您都有
50%
成为
true
50%
成为
false
的机会

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

如果已经采取了许多措施(或者可能全部),那么递归不会结束

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

void recursive(inArgs) {
  if (condition)
    return;
  else
    recursive(outArgs)
}
int choosenMove = rand()%10;

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

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

只是不要依赖随机数提取给出的递归大小写选择的递归代码,因为这没有任何意义。将算法转换为迭代算法。为什么没有意义?实现是这样的:`if(randomMove==4){if(该移动之前已经进行过)AIrandomMove(rand%10,s);else//implementation}`这没有意义,因为您显式地允许非终止行为。使用递归有什么意义?我的意思是,你为什么要求递归?@RazvanNica请在你的帖子中包含所有相关细节,并避免将这些细节放在评论中。这是因为递归算法的终止取决于随机值提取,正如我在第一篇评论中指出的,所以你基本上有一些代码,根据你的幸运程度,它们可能会终止,也可能不会终止,这不是一个正确的设计。。好啊现在我终于明白了。谢谢。现在是我的国家凌晨3点,我确实需要休息一下。不过,我明白了!再次感谢!=)