Java 仅以特定值进入无限循环的程序
我刚开始学习java,在做一个关于排列的练习时(练习要求使用数组a[]创建N个元素的排列,该数组满足无a[I]等于I的要求),我创建了以下代码。在测试它时,我意识到当N=6时,它有时进入无限循环。 你有没有想过问题出在哪里Java 仅以特定值进入无限循环的程序,java,loops,infinite-loop,Java,Loops,Infinite Loop,我刚开始学习java,在做一个关于排列的练习时(练习要求使用数组a[]创建N个元素的排列,该数组满足无a[I]等于I的要求),我创建了以下代码。在测试它时,我意识到当N=6时,它有时进入无限循环。 你有没有想过问题出在哪里 public class GoodPerm { public static void main(String arg[]) { int n = Integer.parseInt(arg[0]); int[] guests = new
public class GoodPerm {
public static void main(String arg[]) {
int n = Integer.parseInt(arg[0]);
int[] guests = new int[n];
for (int i = 0; i < n; i++) {
guests[i] = i;
}
for (int i = 0; i < n; i++) {
int r = i + (int) (Math.random() * (n - i));
int q = guests[r];
guests[r] = guests[i];
guests[i] = q;
if(guests[i] == i){
i --;
}
}
for(int q : guests){
System.out.println(q);
}
}
}
公共类GoodPerm{
公共静态void main(字符串arg[]){
int n=Integer.parseInt(arg[0]);
int[]来宾=新int[n];
对于(int i=0;i
可能代码在另一个值中进入inf循环,但我没有找到任何其他值。此代码始终可以进入inf循环。根据我对代码的理解,您尝试进行一些随机切换以获得所需的结果。但如果数组的最后一个元素从未被切换过,则无法将其切换到任何“稍后/更高”的位置(因为没有更多)。在第二个for循环的“最后”迭代中(因此
i+1==n
在开始时保持)r
将始终计算为i
,因此不会发生真正的切换。如果最后一个元素仍然存在,您将永远重复此操作。这听起来是您花时间学习代码的绝佳机会。如果你通过循环,你的错误应该是显而易见的。是的,这里的逻辑不仅在n=6
时被破坏。我还使用了n=7
得到了一个无限循环。通常减少循环计数器的同时增加循环计数器可能会导致错误,在执行此操作时需要小心。@Carcigenicate它不会再次始终为真,因为guests[i]=q
有时会修改等式的一部分。@Islingre Oops,你是对的。有关更好的算法,请参阅。