2013-07-03 45 views
0

我怎樣才能讓類似的N級循環到我的手動5級的循環在Java中我怎樣才能讓類似的N級循環到我的手動5級的循環在Java中

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 
+5

使用** **遞歸代替! – johnchen902

回答

1

沒有遞歸,只有一些設計循環。 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(); 
    } 
} 

遞歸:用新mama2更換ma以上:

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

非常感謝,這工作!!!。 :) – user2545226

+0

我將這段代碼應用到我的工作中,該工作在最小輸入時很好地工作,但對於例如1,2,3的40個輸入,.. 40那有內存不足的問題。 – user2545226

+0

@ user2545226您是否試圖將所有輸出保存在內存中?如果你是,恐怕OOME不能避免。 – johnchen902

相關問題