繁体   English   中英

C#中的递归错误

[英]Recursion error in C#

有时,我在此代码上遇到递归错误。

有人可以告诉我为什么吗?

我要制作的只是在Tic Tac Toe中自动播放。 没有什么花哨。 只是学习。

 private void Auto_play()
    {
        try
        {
            Random rnd = new Random();
            int d = rnd.Next(0, 9);
            label3.Text = d.ToString();

            if (d == 0 && A1.Enabled)
                A1.PerformClick();
            else if (d == 1 && A2.Enabled)
                A2.PerformClick();
            else if (d == 2 && A3.Enabled)
                A3.PerformClick();
            else if (d == 3 && B1.Enabled)
                B1.PerformClick();
            else if (d == 4 && B2.Enabled)
                B2.PerformClick();
            else if (d == 5 && B3.Enabled)
                B3.PerformClick();
            else if (d == 6 && C1.Enabled)
                C1.PerformClick();
            else if (d == 7 && C2.Enabled)
                C2.PerformClick();
            else if (d == 8 && C3.Enabled)
                C3.PerformClick();
            else
                Auto_play();
        }
        catch { }
    }

通过调用您已经使用的相同方法进行递归是一个坏主意,因为您将很快得到堆栈溢出。 根据已加载的内容,您可能会在数百次迭代中崩溃。

解决方法是不要从自身内部调用该方法。 取而代之的是,您跟踪需要做的工作并循环进行,直到没有更多工作要做为止。 像这样:

Queue<string> queue = new Queue<string>();
queue.Enque(startingValue);

while (queue.Any())
{
    string val = queue.Deque();
    // work with string
    queue.Enque("new string found to do additional work with");
}

如果我需要遍历目录或类似内容,那实际上就是我所使用的,但是您的情况更简单。 我在想可以用以下方法解决:

private void Auto_play()
{
    try
    {
        bool foundMove = false;

        while (!foundMove)
        {
            foundMove = true;

            Random rnd = new Random();
            int d = rnd.Next(0, 9);
            label3.Text = d.ToString();

            if (d == 0 && A1.Enabled)
                A1.PerformClick();
            else if (d == 1 && A2.Enabled)
                A2.PerformClick();
            else if (d == 2 && A3.Enabled)
                A3.PerformClick();
            else if (d == 3 && B1.Enabled)
                B1.PerformClick();
            else if (d == 4 && B2.Enabled)
                B2.PerformClick();
            else if (d == 5 && B3.Enabled)
                B3.PerformClick();
            else if (d == 6 && C1.Enabled)
                C1.PerformClick();
            else if (d == 7 && C2.Enabled)
                C2.PerformClick();
            else if (d == 8 && C3.Enabled)
                C3.PerformClick();
            else
                foundMove = false;
        }
    }
    catch { }
}

出于兴趣考虑,请注意: Random不是很随机。 您甚至可能会发现自己不断重复播放同一游戏或一组游戏(如果您在某处跟踪了它们)。 用计算机来获得一个真正的随机数是 很难的 ,但这是一个已经写很多篇的主题。

更新:正如Nate M.指出的那样:上面的代码仍然很粗糙,实际上并没有完成。 由于多种条件,您仍然可能陷入无休止的循环:

  1. 游戏已经结束,该方法被调用(即不再有有效的移动位置)。
  2. 随机调用会不断给出相同的数字或一组数字。
  3. 我可能还缺少一两个... :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM