2014-10-07 21 views
0

我嘗試重構此代碼幾個小時。重構排列發現

for (int i = 1; i <= 10; i++) { 
     for (int ii = 2; ii <= 10; ii++) { 
      if (ii > i) { 
       for (int iii = 3; iii <= 10; iii++) { 
        if (iii > ii && iii > i) { 
         for (int iiii = 4; iiii <= 10; iiii++) { 
          if (iiii > i && iiii > ii && iiii > iii) { 
           for (int iiiii = 5; iiiii <= 10; iiiii++) { 
            if (iiiii > i && iiiii > ii && iiiii > iii && iiiii > iiii) { 
             FileUtils.writeStringToFile(file, i + " " + ii + " " + iii + " " + iiii + " " + iiiii + "\n", true); 
            } 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
    } 

的目標將是獲得兩個輸入整數(環5在這段代碼數量(),和一個數字(10在這種情況下,最大值),但我沒有IDE如何做到這一點。對不起,我不完美的英語,將是我的家庭作業有很大幫助。

+0

這是很多我的:-) – Leo 2014-10-07 20:08:49

+0

我認爲這樣的代碼是美麗的! – 2014-10-07 20:08:58

+0

它似乎是一個5位數的十進制數字,其中每個數字都大於前一個數字。 – weston 2014-10-07 20:09:41

回答

1

爲了得到一個可變數量的循環,你需要使用遞歸。事情是這樣的。

public static void combine(int values, int maximum, Consumer<int[]> consumer) { 
    combine0(0, values, 1, maximum-values+1, new int[values], consumer); 
} 

static void consumer0(int index, int values, int min, int max, List<Integer> ints, Consumer<List<integer>> consumer) { 
    if (index == values) { 
     consumer.apply(ints); 
     return; 
    } 
    for(int i = min; i <= max ; i ++) { 
     ints[index] = i; 
     comsumer0(index+1, values, min+1, max+1, ints, consumer); 
    } 
} 

有很多方法可以改進它,你可以只使用一個循環,但你將不得不使用一些數學;)

我會開始。

for (int i = 1; i <= 10; i++) { 
    for (int ii = 2; ii <= 10; ii++) { 
     if (ii > i) { 

相同

for (int i = 1; i < 10; i++) { 
    for (int ii = i+1; ii <= 10; ii++) { 

當您添加更多的循環,你可以看到,i不可能永遠是10,或者以同樣的方式9等,你可以看到ii必須是至少2.

+0

謝謝,我喜歡你的想法。 你可以幫助數學或組織循環部分。我只是無法擺脫它。如果我真的看到一些例子,並且從那個「下一刻」我可以找出一些抽象的方式來做下一次,那麼會更容易理解。 – digitalized 2014-10-07 20:47:52

+0

@digitalized我已更新我的答案 – 2014-10-07 20:59:36

+0

看起來很棒,感謝您的幫助。 – digitalized 2014-10-07 21:01:19