[英]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.指出的那样:上面的代码仍然很粗糙,实际上并没有完成。 由于多种条件,您仍然可能陷入无休止的循环:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.