Kev*_*ung 1 c# stack-overflow random recursion
public int S1x;
public void Execute()
{
Random random = new Random();
S1x = random.Next(14, 146);
if (S1x % 15 != 0)
Fix(S1x);
}
public int Fix(int SX)
{
Random randomG = new Random();
SX = randomG.Next(14, 146);
if (SX % 15 != 0)
Fix(SX); // This is the recursion
return SX;
}
Run Code Online (Sandbox Code Playgroud)
每次运行它都会正常工作,但之后我会尝试再次编译并运行它会给我这个错误:
System.StackOverflowException未处理mscorlib.dll中发生未处理的类型"System.StackOverflowException"异常{无法计算表达式,因为当前线程处于堆栈溢出状态.}
并且,是的,我知道有一种更简单的方法可以做到这一点,但是我的方法是将值设置为等于14到146之间的随机数,同时还要确保它是15的倍数,但仍然可以工作.
我真的很困惑为什么它有时只给我错误信息.
那有什么不对呢?为什么它被标记为无限递归,即使它没有任何无限的东西?
Eri*_*ert 18
即使你解决了这个问题 - 你每次根据当前时间播种时都在创建一个新的Random对象 - 你的代码既不正确也不高效.请记住,递归方法需要具有以下特征才能正确:
您没有任何这些属性,因此递归是错误的解决方案.
如果您想要一个介于14和146之间的随机数以及15的倍数,则不需要任何递归.唯一这样的数字是15,30,45,60,75,90,105,120和135.所以只说:
private int[] array = { 15, 30, 45, 60, 75, 90, 105, 120, 135 };
private Random random = new Random();
...
return array[random.Next(0, array.Length)];
Run Code Online (Sandbox Code Playgroud)
甚至更好:选择1到9之间的随机数,然后乘以15.
return random.Next(1, 10) * 15;
Run Code Online (Sandbox Code Playgroud)