程序仅使用特定值进入无限循环
Program entering in a infinite loop only with a specific value
我刚从 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 循环,但我没有找到任何其他值。
这段代码总是可以进入一个inf循环。据我了解代码,您尝试进行一些随机切换以获得所需的结果。但是如果你的数组的最后一个元素从未被切换过,那么它就不可能切换到任何 "later/higher" 位置(因为没有更多)。在第二个 for 循环的 "last" 迭代中(因此 i + 1 == n
在开始时保持不变) r
将始终评估为 i
因此不会发生真正的切换。如果最后一个元素仍然存在,你将永远重复这个。
我刚从 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 循环,但我没有找到任何其他值。
这段代码总是可以进入一个inf循环。据我了解代码,您尝试进行一些随机切换以获得所需的结果。但是如果你的数组的最后一个元素从未被切换过,那么它就不可能切换到任何 "later/higher" 位置(因为没有更多)。在第二个 for 循环的 "last" 迭代中(因此 i + 1 == n
在开始时保持不变) r
将始终评估为 i
因此不会发生真正的切换。如果最后一个元素仍然存在,你将永远重复这个。