0

javaで手動の5レベルforループに似たnレベルループを作成するにはどうすればよいですか

public class TestPermutation
{

  public static void main(String[] args)
  {
    int[] input = {1,2,3,4,5};
    ma(input);
  }

  public static void ma(int[] input)
  {
    int n = input.length;
    for(int i=0;i<n;i++)
    {
      System.out.println(input[i]);
      for(int j=i+1;j<n;j++)
      {
        System.out.println(input[i]+" "+input[j]);
        for(int k=j+1;k<n;k++)
        {
          System.out.println(input[i]+" "+input[j]+" "+input[k]);
          for(int l=k+1;l<n;l++)
          {
            System.out.println(input[i]+" "+input[j]+" "+input[k]+" "+input[l]);
            for(int m=l+1;m<n;m++)
            {
              System.out.println(input[i]+" "+input[j]+" "+input[k]+" "+input[l]+" "+input[m]);
            }
          }
        }
      }
    }
  }
}

どうすればいいですか?とにかく、これは私のコードからの出力です。

1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
1 2 3 5
1 2 4
1 2 4 5
1 2 5
1 3
1 3 4
1 3 4 5
1 3 5
1 4
1 4 5
1 5
2
2 3
2 3 4
2 3 4 5
2 3 5
2 4
2 4 5
2 5
3
3 4
3 4 5
3 5
4
4 5
5
4

3 に答える 3

1

No recursion, only some designed loop. Live demo.

import java.util.Stack;

public class Test {

    public static void main(String[] args) {
        int[] input = { 1, 2, 3, 4, 5 };
        ma(input);
    }

    public static void ma(int[] input) {
        Stack<Boolean> stack = new Stack<>();
        while (true) {
            while (stack.size() < input.length) {
                stack.push(true);
                print(stack, input);
            }
            while (!stack.isEmpty() && !stack.peek())
                stack.pop();
            if (stack.isEmpty())
                break;
            stack.pop();
            stack.push(false);
        }
    }

    public static void print(Stack<Boolean> stack, int[] input) {
        boolean begin = true;
        for (int i = 0; i < stack.size(); i++)
            if (stack.get(i)) {
                if (begin)
                    begin = false;
                else
                    System.out.print(' ');
                System.out.print(input[i]);
            }
        System.out.println();
    }
}

Recursion: Replace ma above with a new ma and ma2:

    public static void ma(int[] input) {
        ma2(input, new Stack<Boolean>());
    }

    public static void ma2(int[] input, Stack<Boolean> stack) {
        if (!stack.isEmpty() && stack.peek())
            print(stack, input);
        if (stack.size() < input.length) {
            stack.push(true);
            ma2(input, stack);
            stack.pop();
            stack.push(false);
            ma2(input, stack);
            stack.pop();
        }
    }
于 2013-07-03T07:06:09.043 に答える
0

このアプローチは再帰と呼ばれます。たとえば、この m,ight ヘルプ:例として、指定された文字列のすべての順列の生成

于 2013-07-03T06:32:55.767 に答える
0

再帰はあなたが探しているものです。

再帰は多くの場所で何度も説明されていますが、ここにその 1 つを示します。

于 2013-07-03T06:33:08.497 に答える