动态更改嵌套for循环的数量

我不知道这是不是一个愚蠢的问题,但我需要在不使用递归的情况下动态更改for循环的数量。

例如,如果n = 3,我需要3个嵌套的for循环。

for(int i=0; i<size; i++){ for(int j=0; j<size-1; j++){ for(int k=0; k<size-2; k++){ //do something } } } 

如果n = 5:

 for(int i=0; i<size; i++){ for(int j=0; j<size-1; j++){ for(int k=0; k<size-2; k++){ for(int l=0; l<size-3; l++){ for(int m=0; m<size-4; m++){ //do something } } } } } 

有没有办法在没有递归的情况下实现这一点? 另一个问题:在Java中使用Multiple Dispatch有什么用? 我试图用一种方法编写代码,它应该在参数的不同情况下运行不同的事件。 如果声明/三元运营商/案例。

注意:我只能有一个方法(部分问题),并且不能使用递归。 抱歉。

想想你经历这个循环多少次。 看起来像(size!) / (size - n)!

 int numLoops = 1; for (int i = 0; i < n; i++) { numLoops*= (size - i); } for (int i = 0; i < numLoops; i++) { //do something } 

这取决于你究竟想要做什么。 递归总是可以用迭代替换(有关使用Stack存储状态的示例,请参阅此文章 )。

但也许模数(%)运算符可以在这里工作? 即,使用单个循环递增变量( i ),然后使用模数( i % 3等)计算其他变量。 如果存在不同数量的变量,您可以使用Map间接存储变量的值。

您必须创建循环计数器数组并手动递增它。

快速而肮脏的例子:

 public static void nestedFors(int n, int size) { assert n > size; assert size > 0; int[] i = new int[n]; int l = n - 1; while(l >= 0) { if(l == n - 1) { System.out.println(Arrays.toString(i)); } i[l]++; if(i[l] == size - l) { i[l] = 0; l--; } else if(l < n - 1) { l++; } } } 

用您自己的代码替换System.out.println(Arrays.toString(i))

你可以在这里查看: http : //ideone.com/IKbDUV

这有点令人费解,但是:这是一种方法,在没有递归的情况下,在一个函数中,没有if

 public static void no_ifs_no_recursion(int n){ int[] helper = new int[n-1]; int[] pointers = new int[n]; //helper for printing the results int totalsize = 1; for (int loops = 2; loops <= n; loops++){ helper[n - loops] = totalsize; totalsize*=loops; } for (int i=0; i `pointers[0]`, `j` -> `pointers[1]`, `k` -> `pointers[2]` etc.. } } 

我认为你需要一个回溯算法。 但是你会用递归替换你的嵌套循环。

我不想在这里发布链接,因为似乎主持人不喜欢这样。

看看“八皇后拼图”(你可以谷歌吧),你会得到我的想法。

我知道这个想法是有效的,因为我已经在很多场合向我自己提出了同样的问题,并且我已成功应用了几次。

这是一个小例子(我改变它,因为前一个有点复杂)。

 public class Test001 { public static void main(String[] args) { loop(0, 5, 10); } /** * max_level - the max count of nesting loops * size - the size of the collection * * 0 - top most level * level 1 - nested into 0 * level 2 - nested into 1 * ... * and so on. */ private static void loop(int level, int max_level, int size){ if (level > max_level) return; for (int i=0; i