2012-10-24 65 views
7

我試圖用表中的每個元素組合來執行一個函數。 (在Lua)。表和元素可以改變,但結構將保持不變。該表的組織方式使其[1]將成爲函數的第一個參數,依此類推。查找表中每個元素的組合(Lua/PseudoCode)

如果這是我有一個表,

Table = { 
    [1] = {Player1, Player2} 
    [2] = {PlayerA, PlayerB, PlayerC} 
    [3] = {PlayerOne, PlayerTwo} 
} 

如果我手動寫了這一點,它可能是這樣的:(鑑於該功能名爲EXE)。

Exe(Player1, PlayerA, PlayerOne) 
Exe(Player2, PlayerA, PlayerOne) 
Exe(Player3, PlayerA, PlayerOne) 

Exe(Player1, PlayerB, PlayerOne) 
Exe(Player2, PlayerB, PlayerOne) 
Exe(Player3, PlayerB, PlayerOne) 

Exe(Player1, PlayerC, PlayerOne) 
Exe(Player2, PlayerC, PlayerOne) 
Exe(Player3, PlayerC, PlayerOne) 


Exe(Player1, PlayerA, PlayerTwo) 
Exe(Player2, PlayerA, PlayerTwo) 
Exe(Player3, PlayerA, PlayerTwo) 

Exe(Player1, PlayerB, PlayerTwo) 
Exe(Player2, PlayerB, PlayerTwo) 
Exe(Player3, PlayerB, PlayerTwo) 

Exe(Player1, PlayerC, PlayerTwo) 
Exe(Player2, PlayerC, PlayerTwo) 
Exe(Player3, PlayerC, PlayerTwo) 

不過,我不想寫出來,它打破了,如果你在程序中複製和粘貼,你這樣做是不對的拇指我的一般規則。

因此,我想通過表格並執行每一個可能的組合。這個問題使得表可以(可能)在其中有任何數量的表,並且表內的表可能具有無限數量的值。

例如,表會看起來像這樣:

Table = { 
    [1] = {Player1, Player2} 
    [2] = {PlayerA} 
    [3] = {PlayerOne} 
} 

在其中執行最終將手動看起來像這樣:

Exe(Player1, PlayerA, PlayerOne) 
Exe(Player2, PlayerA, PlayerOne) 

此外,表可能落得像這樣:

Table = { 
    [1] = {Player1, Player2} 
    [2] = {PlayerA} 
    [3] = {PlayerOne} 
    [4] = {PlayerUno, PlayerDos} 
    [5] = {PlayerApple, PlayerBoy, PlayerCat, PlayerDog} 
} 

其中,exeuction最終會像..

Exe(Player1, PlayerA, PlayerOne, PlayerUno, PlayerApple) 
Exe(Player2, PlayerA, PlayerOne, PlayerUno, PlayerApple) 

Exe(Player1, PlayerA, PlayerOne, PlayerDos, PlayerApple) 
Exe(Player2, PlayerA, PlayerOne, PlayerDos, PlayerApple) 


Exe(Player1, PlayerA, PlayerOne, PlayerUno, PlayerBoy) 
Exe(Player2, PlayerA, PlayerOne, PlayerUno, PlayerBoy) 

Exe(Player1, PlayerA, PlayerOne, PlayerDos, PlayerBoy) 
Exe(Player2, PlayerA, PlayerOne, PlayerDos, PlayerBoy) 


Exe(Player1, PlayerA, PlayerOne, PlayerUno, PlayerCat) 
Exe(Player2, PlayerA, PlayerOne, PlayerUno, PlayerCat) 

Exe(Player1, PlayerA, PlayerOne, PlayerDos, PlayerCat) 
Exe(Player2, PlayerA, PlayerOne, PlayerDos, PlayerCat) 


Exe(Player1, PlayerA, PlayerOne, PlayerUno, PlayerDog) 
Exe(Player2, PlayerA, PlayerOne, PlayerUno, PlayerDog) 

Exe(Player1, PlayerA, PlayerOne, PlayerDos, PlayerDog) 
Exe(Player2, PlayerA, PlayerOne, PlayerDos, PlayerDog) 

正如你所看到的,我發現了一種模式...我能夠將上面的'執行'事件分成段/組,例如第1行和第2行有一個變化。然後,他們被複制到第4行和第5行,但下一個變量get被改變了。如您所見,我無法將該模式置入代碼中。我認爲一些函數遞歸是必需的,但我不知道如何通過它遞歸或遞歸。我在想,我將不得不使用函數作爲參數和解壓函數,但我不確定這將如何工作。

此外,這是必需的原因,而不只是手動複製和粘貼它(實際上會更容易),是因爲表的內容將被生成。

你們能幫助我嗎?

回答

7

使用遞歸。

設想一個函數map_all (fcn, tab, idx, ...)映射fcntab[1]tab[idx]到前綴的所有表的元素的乘積來...

基礎案例是當idx小於1。在這種情況下,簡單地套用fcn(...)

否則,map_all(fcn, tab, idx-1, <el>, ...)所有<el>tab[idx]

function map_all (fcn, tab, idx, ...) 
    if idx < 1 then 
     fcn(...) 
    else 
     local t = tab[idx] 
     for i = 1, #t do map_all(fcn, tab, idx-1, t[i], ...) end 
    end 
end 

所以,

> Table = { 
>>  [1] = {'Player1', 'Player2'}, 
>>  [2] = {'PlayerA', 'PlayerB', 'PlayerC'}, 
>>  [3] = {'PlayerOne', 'PlayerTwo'} 
>> } 
> map_all(print, Table, #Table) 
Player1 PlayerA PlayerOne 
Player2 PlayerA PlayerOne 
Player1 PlayerB PlayerOne 
Player2 PlayerB PlayerOne 
Player1 PlayerC PlayerOne 
Player2 PlayerC PlayerOne 
Player1 PlayerA PlayerTwo 
Player2 PlayerA PlayerTwo 
Player1 PlayerB PlayerTwo 
Player2 PlayerB PlayerTwo 
Player1 PlayerC PlayerTwo 
Player2 PlayerC PlayerTwo 

> Table = { 
>>  [1] = {'Player1', 'Player2'}, 
>>  [2] = {'PlayerA'}, 
>>  [3] = {'PlayerOne'} 
>> } 
> map_all(print, Table, #Table) 
Player1 PlayerA PlayerOne 
Player2 PlayerA PlayerOne 

> Table = { 
>>  [1] = {'Player1', 'Player2'}, 
>>  [2] = {'PlayerA'}, 
>>  [3] = {'PlayerOne'}, 
>>  [4] = {'PlayerUno', 'PlayerDos'}, 
>>  [5] = {'PlayerApple', 'PlayerBoy', 'PlayerCat', 'PlayerDog'}, 
>> } 
> map_all(print, Table, #Table) 
Player1 PlayerA PlayerOne PlayerUno PlayerApple 
Player2 PlayerA PlayerOne PlayerUno PlayerApple 
Player1 PlayerA PlayerOne PlayerDos PlayerApple 
Player2 PlayerA PlayerOne PlayerDos PlayerApple 
Player1 PlayerA PlayerOne PlayerUno PlayerBoy 
Player2 PlayerA PlayerOne PlayerUno PlayerBoy 
Player1 PlayerA PlayerOne PlayerDos PlayerBoy 
Player2 PlayerA PlayerOne PlayerDos PlayerBoy 
Player1 PlayerA PlayerOne PlayerUno PlayerCat 
Player2 PlayerA PlayerOne PlayerUno PlayerCat 
Player1 PlayerA PlayerOne PlayerDos PlayerCat 
Player2 PlayerA PlayerOne PlayerDos PlayerCat 
Player1 PlayerA PlayerOne PlayerUno PlayerDog 
Player2 PlayerA PlayerOne PlayerUno PlayerDog 
Player1 PlayerA PlayerOne PlayerDos PlayerDog 
Player2 PlayerA PlayerOne PlayerDos PlayerDog 
> 
+0

所以,作爲運行通過時,該功能將取出在主表中的頂部值,所以在這種情況下: >表= { >> [1] = { 'PLAYER1',「Player2 '}, >> [2] = {'PlayerA'}, >> [3] = {'PlayerOne'} >>} 它會拉出[3],然後拉出[2],並將撤出[1]。 所以......部分會慢慢轉移到適應這些,直到所有的論點存在? 另外,它會執行時,沒有什麼可以拔出,對吧?試圖弄清楚它是如何工作的...... – Stormswept

+1

是的,它從最後一個子表開始遍歷主表,將值推到'...'的前面,並在最終用完子表時調用該函數。當函數返回時,它會返回到下一個迭代的一個級別;當迭代結束時,它也回到上一個層次。 –

相關問題