【问题标题】:Nested For Loops Dynamic Depth Java嵌套 For 循环动态深度 Java
【发布时间】:2012-12-01 15:51:46
【问题描述】:

您好,我是编程新手并已注册此论坛:)

所以我创建了一个带有嵌套 for 循环的小程序,它打印出五个数字的所有组合,这些数字的值可以从 0 到 5。使用嵌套的 for 循环可以正常工作。但是没有更清洁的解决方案吗?我尝试调用 for 循环本身,但我的大脑没有得到解决方案.. :(

//my ugly solution
int store1, store2, store3, store4, store5;
        for (int count = 0; count <= 5; count++) {
            store1 = count;
            for (int count2 = 0; count2 <= 5; count2++) {
                store2 = count2;
                for (int count3 = 0; count3 <= 5; count3++) {
                    store3 = count3;
                    for (int count4 = 0; count4 <= 5; count4++) {
                        store4 = count4;
                        System.out
                                .println(store1 + " " + store2 + " " + store4);
                }
 //I'm trying around with something like this 
    void method1() {
        for (int count = 0; count <= 5; count++) {
                    list.get(0).value = count;
            count++;
            method2();
        }
    }
    void method2() {
        for (int count = 0; count <= 5; count++) {
                    list.get(1).value = count;
            count++;
            method1();
        }
    }

【问题讨论】:

  • 我认为您正在寻找递归
  • 是的,今天搜索了一下,有时会迷路,但我并没有真正明白如何实现。
  • 为什么在循环中增加计数时,在循环中增加计数?
  • 糟糕!这是一个错误..->谢谢!

标签: java algorithm loops nested


【解决方案1】:

通常当人们尝试使用递归或函数时,使用循环更简单或更快。但是,在这种情况下,递归是结合循环的更简单的选择。

public static void method(List<Integer> list, int n, int m) {
   if (n < 0) {
       process(list);
   } else {
      for(int i = 0; i < m; i++) {
         list.set(n, i);
         method(list, n-1, m);
      }
   }
}

【讨论】:

  • 谢谢,我正在尝试。
【解决方案2】:

我知道您正在尝试组合,但这可能会有所帮助。

重复排列

当你有 n 个东西可供选择时……你每次都有 n 个选择!

在选择它们时,排列是:

n × n × ... (r 次) = n^r

//when n and r are known statically

class Permutation
{
    public static void main(String[] args)
    {
        char[] values = {'a', 'b', 'c', 'd'};
        int n = values.length;
        int r = 2; 

        int i = 0, j = 0;
        for(i=0; i<n; i++)
        {
            for(j=0; j<n; j++)
            {
                System.out.println(values[j] + " " + values[i]);
            }
        }
    }
}


//when n and r are known only dynamically

class Permutation
{
    public static void main(String[] args)
    {
        char[] values = {'a', 'b', 'c', 'd'};
        int n = values.length;
        int r = 2; 
        int i[] = new int[r];
        int rc = 0;
        for(int j=0; j<Math.pow(n,r); j++)
        {

            rc=0;
            while(rc<r)
            {
                System.out.print(values[i[rc]] + " ");
                rc++;
            }
            System.out.println();
            rc = 0;
            while(rc<r)
            {
                if(i[rc]<n-1)
                {
                    i[rc]++;
                    break;
                }
                else
                {
                    i[rc]=0;
                }
                rc++;
            }
        }
    }
}

【讨论】:

  • 谢谢 :) 对于语法较差的问题(我正在学习英语),我在 30 分钟内得到了六个有启发性的答案。太棒了。 :)
  • 对我来说 - 这是解决方案!
【解决方案3】:

我能想到的最简单的代码会用一种完全不同的方法来解决这个问题:

public class TestA {
    public static void main(String[] argv) {
        for (int i=0; i<(6 * 6 * 6 * 6 * 6); ++i) {
            String permutation = Integer.toString(i, 6);
            System.out.println("00000".substring(permutation.length()) + permutation);
        }
    }
}

从您的文本(不是您的代码)中,我推测您有 5 个位置和 6 个符号,这表明有 6 到 5 次方组合。所以代码只是计算这些数字并将数字转换为输出组合。

由于这也可以看作是一个以 6 为底的数字系统,因此它使用了 Integer.toString,它已经为此提供了格式化代码(前导零除外)。在缺少的地方添加前导零。

【讨论】:

    【解决方案4】:

    这里是另一个交互但不太优雅的版本

    while (store1 < 6) {
            store5++;
            if (store5 == 6) {
                store5 = 0;
                store4++;
            }
            if (store4 == 6) {
                store4 = 0;
                store3++;
            }
            if (store3 == 6) {
                store3 = 0;
                store2++;
            }
            if (store2 == 6) {
                store2 = 0;
                store1++;
            }
            System.out.println(store1 + " " + store2 + " " + store3 + " " + store4 + " " + store5 + " ");
        }
    

    【讨论】:

      【解决方案5】:

      这样的?

      // Print all sequences of len(list)+n numbers that start w/ the sequence in list
      void method( list, n ) {
          if ( list.length == n )
              // print list
          else for ( int c=0; c<=5; c++ ) {
              // add c to end of list
              method( list, n );
              // remove c from end of list
          }
      }
      

      初始调用为 method( list, 5 ),其中 list 最初为空。

      【讨论】:

      • 谢谢,我正在尝试。
      最近更新 更多