我刚开始使用 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); } }}也许代码进入另一个值的中循环,但我没有找到任何其他值。
1 回答

BIG阳
TA贡献1859条经验 获得超6个赞
这段代码总是可以进入inf-loop。据我了解代码,您尝试做一些随机切换来实现您需要的结果。但是,如果数组的最后一个元素从未被切换过,则无法将其切换到任何“稍后/更高”的位置(因为没有更多的位置)。在第二个 for 循环的“最后”迭代中(因此i + 1 == n
在开始时保持)r
将始终评估,i
因此不会发生真正的切换。如果最后一个元素仍然存在,你将永远重复这个过程。
添加回答
举报
0/150
提交
取消