Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 仅以特定值进入无限循环的程序_Java_Loops_Infinite Loop - Fatal编程技术网

Java 仅以特定值进入无限循环的程序

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

我刚开始学习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 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,你是对的。有关更好的算法,请参阅。