2016-01-29 70 views
-4

如何在Java中編寫一個遞歸方法,該方法使用變量數量打印3個不同數字的組合? (不應該包括重複)。也就是說,該方法應該適用於不同的組合長度。例如,對於組合中使用的數字0,1,2和兩個數字,應該有:0 0 - 0 1 - 0 2 - 1 1 - 1 2 - 2 2.如何獲得固定數量的元素和可變元素數量的組合(不重複)

使用相同的數字,組合3個號碼是: 0 0 0 - 0 0 1 - 0 0 2 - 0 1 1 - 0 1 2 - (...), 等等。 我已經檢查了其他類似主題的遞歸方法的幾種類型,但我仍然不能完全理解這一點,並寫我自己的方法。

+0

打開IDE。 創建JAVA項目。 創建班級。 實施你的方法。 –

+0

歡迎來到stackoverflow ..請閱讀提問的指導方針.. http://stackoverflow.com/help/asking – awsome

回答

0

也許嘗試首先計算所有排列。然後繼續計算組合。維基上的圖像非常有啓發性https://en.wikipedia.org/wiki/Combination

你也可以通過下面的代碼嘗試筆和紙:Combinations method return issue

+0

感謝您的回答!我已經看到了建議的解決方案,但是遞歸方法似乎很難實現。如果您有興趣,請參閱我的解決方案。我不知道在執行速度等方面是否可以,但它對我有用。 – chris

0

我已經想出了一個非遞歸解決方案,它基於一個基於n的數字系統的數量。例如,對於基數爲3的系統,添加的數字是3的冪。

需要注意的是,這將打印所有組合,並且具有重複元素的組合應該隨後刪除,如我的情況所需。例如,從組合001,010,100中,只有第一個應該留下,元素按升序排列。

public static void main(String[] args) { 
    int t = 2; 
    int r = 2; 
    ArrayList<Integer> l = new ArrayList<Integer>(); 
    int tmp; 
    for (int p = 0; p <= (int)(Math.pow((double)t, (double)r)) - 1; p++) { 
     tmp = p; 
     for (int q = r - 1; q >= 0; q--) { 
      for (int s = t - 1; s >= 0; s--) { 
       if (tmp >= s * (int) (Math.pow(t, q))) { 
        l.add(Integer.valueOf(s)); 
        tmp = tmp - s * (int) (Math.pow(t, q)); 
        break; 
       } 
      } 
     } 
    } 
    for (int i = 0; i <= l.size() - 1; i++) { 
     if (i % r != r - 1) { 
      System.out.print(l.get(i) + "-"); 
     } else { 
      System.out.println(l.get(i)); 
     } 
    } 
} 
相關問題