2013-04-07 63 views
3

這可能是一件簡單的事情,但我需要創建一個循環結構,使其循環y^x次以創建x和y的所有可能組合。例如,如果有4間的彼此和X有2 Y的,我希望做這樣的事情:高效創建一個嵌套的循環x層深

for(int a=0; a < y; a++){ 
    for(int b=0; b < y; b++){ 
     for(int c=0; c < y; c++){ 
      for(int d=0; d < y; d++){ 
       // create a new object with values of a, b, c, d 
      } 
     } 
    } 
} 

基本上,創建嵌入的X號for循環來創建一個總Ÿ^ x的對象(在這個案例,其中16個)。假設值x和y可以改變,那麼最簡單和最有效的方法是什麼?我假設遞歸可能以某種方式參與,但我不是100%確定如何去做。

+2

看起來像一個糟糕的設計選擇,你最終的目的是什麼? – 2013-04-07 19:31:59

+0

我正在嘗試創建音階的每種可能的組合。半音音階系統中有12個音調。我的想法是做這樣的事情來產生1到12個音階的可能組合(總共4,096個組合)。我想保持音調數量可變,以保持對非半音音階系統開放的潛力(比如某些東部音階,每個音階40+音調)。 – 2013-04-07 19:35:27

+0

遞歸肯定是要走的路,請查看下面的答案 – 2013-04-07 19:37:12

回答

3

當你不知道在編譯時嵌套的水平,你需要使用遞歸:函數應該有代表k個嵌套級單迴路,並繼續調用自身遞歸直到達到N個級別:

-(void) nestAtLevel:(int)k withItems:(int[])items from:(int) from to:(int)to { 
    if (k >= 0) { 
     for (items[k] = from ; items[k] != to ; items[k]++) { 
      [self nestAtLevel:k-1 withItems:items from:from to:to]; 
     } 
    } else { 
     // Use the indexes produced recursively: the current values are in items 1..N-1 
     [self creatObjectsWithIndexes:items]; 
    } 
} 

最初的電話應該是這樣的:

int items[5]; 
[self nestAtLevel:4 withItems:items from:0 to:4]; 

我認爲還有一個功能creatObjectsWithIndexes,它利用索引項的數組,併產生是他們的一個對象。

+0

完美,非常感謝! – 2013-04-07 19:39:26

+0

實際上,關於這個的一個更簡單的問題 - 如果我在程序第一次運行時將類似這樣的東西用作類的指定初始化程序,我是否會想要在單獨的線程上執行此遞歸?我在想,如果k是12,n是2,那麼createObjectsWithIndexes正在創建的4,096個對象 - 對於主線程來說,這不是很重要嗎?如果這是一個愚蠢的問題,再次感謝新手。 – 2013-04-08 00:09:31

+0

@NateKimball這很大程度上取決於你做了4096次這樣的事情:如果事情很快,4096不是很多;如果速度慢,卸載到單獨的線程可能是一個好主意。 – dasblinkenlight 2013-04-08 00:16:42

0

標準的做法是使用遞歸。

您將有功能類似的:

void foo(int level, const int max_depth) { 
    if (level == max_depth) { 
     // code from final loop 
     return; 
    } else { 
     for (...) { 
      foo(level+1, max_depth); 
     } 
    } 
} 

現在你可以在MAX_DEPTH通過進行嵌套層次的任意數量。