我刚开始接触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-loop,但我没有找到任何其他值。
最佳答案
这段代码总是可以进入inf-loop。据我了解代码,您尝试做一些随机切换来实现您需要的结果。但是,如果数组的最后一个元素从未被切换过,则无法将其切换到任何“稍后/更高”的位置(因为没有更多的位置)。在第二个 for 循环的“最后”迭代中(因此 i + 1 == n
在开头成立)r
将始终评估为 i
因此没有发生真正的切换。如果最后一个元素仍然存在,您将永远重复此操作。
关于java - 程序仅以特定值进入无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57997839/