0

如何使 n 级循环类似于我在 java 中的手动 5 级 for 循环

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

没有递归,只有一些设计的循环。现场演示

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();
    }
}

递归:将ma上面替换为新的maand 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

这种方法称为递归。例如,这可能会有所帮助:作为示例生成所有排列的给定字符串

于 2013-07-03T06:32:55.767 回答
0

递归是您正在寻找的。

递归在很多地方已经解释过很多次了,这里是其中之一:理解递归

于 2013-07-03T06:33:08.497 回答