我尝试重构这段代码几个小时。
for (int i = 1; i <= 10; i++) {
for (int ii = 2; ii <= 10; ii++) {
if (ii > i) {
for (int iii = 3; iii <= 10; iii++) {
if (iii > ii && iii > i) {
for (int iiii = 4; iiii <= 10; iiii++) {
if (iiii > i && iiii > ii && iiii > iii) {
for (int iiiii = 5; iiiii <= 10; iiiii++) {
if (iiiii > i && iiiii > ii && iiiii > iii && iiiii > iiii) {
FileUtils.writeStringToFile(file, i + " " + ii + " " + iii + " " + iiii + " " + iiiii + "\n", true);
}
}
}
}
}
}
}
}
}
目标是获得两个输入整数(循环的数量(此代码中为5),以及一个数字的最大值(在这种情况下为10),但我没有想法如何实现这一点。抱歉,我的英语不完美。对我的作业有很大的帮助。
答案 0 :(得分:1)
要获得可变数量的循环,您需要使用递归。这样的事情。
public static void combine(int values, int maximum, Consumer<int[]> consumer) {
combine0(0, values, 1, maximum-values+1, new int[values], consumer);
}
static void consumer0(int index, int values, int min, int max, List<Integer> ints, Consumer<List<integer>> consumer) {
if (index == values) {
consumer.apply(ints);
return;
}
for(int i = min; i <= max ; i ++) {
ints[index] = i;
comsumer0(index+1, values, min+1, max+1, ints, consumer);
}
}
有很多方法可以改进它,你可以只使用一个循环,但你必须使用一些数学;)
我会开始。
for (int i = 1; i <= 10; i++) {
for (int ii = 2; ii <= 10; ii++) {
if (ii > i) {
与
相同for (int i = 1; i < 10; i++) {
for (int ii = i+1; ii <= 10; ii++) {
当您添加更多循环时,您可以看到i
不能是10或9等,就像您看到ii
必须至少为2一样。