2012-10-24 9 views
7

テーブルの要素の組み合わせごとに関数を実行しようとしています。 (ルア語で)。表と要素は変更できますが、構造は同じままです。テーブルは、[1]がその関数の最初の引数となるように編成されています。テーブル内の要素のすべての組み合わせを見つける(Lua/PseudoCode)

これは私が持っているテーブルである場合は、

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

私は手動でそれを書いた場合、それはおそらく次のようになります(関数がエグゼ命名されていることを考えると)。

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} 
} 

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

再帰を使用します。 idxが1未満である場合

ベースケース...

前に付加tab[idx]にすべてのテーブルtab[1]の要素の積にfcnをマッピング機能map_all (fcn, tab, idx, ...)を想像です。その場合には、単に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 

内のすべての <el>のために、それ以外の場合は map_all(fcn, tab, idx-1, <el>, ...)fcn(...)

を適用

> 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

はい、最後のサブテーブルから開始し、値を '...'の前に押してメインテーブルを反復し、最終的にサブテーブルを使い果たしたときに関数を呼び出します。関数が戻ると、次の反復まで1レベル上に戻ります。反復が終了すると、1つ上のレベルに戻り次のインターラクションに戻ります。 –

関連する問題