首页 > 解决方案 > 程序仅以特定值进入无限循环

问题描述

我刚开始使用 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);
        }
    }
}

也许代码以其他值进入 inf 循环,但我没有找到任何其他值。

标签: javaloopsinfinite-loop

解决方案


此代码始终可以进入 inf 循环。据我了解代码,您尝试进行一些随机切换以实现所需的结果。但是如果你的数组的最后一个元素从未被切换过,就不可能将它切换到任何“更高/更高”的位置(因为没有更多的)。在您的第二个 for 循环的“最后一次”迭代中(所以i + 1 == n在开始时保持)r将始终评估为i因此不会发生真正的切换。如果最后一个元素仍然存在,您将永远重复此操作。


推荐阅读