Das dürfte rekursiv leichter zu lösen sein:
Code:
function Kombis(kz, sz, i : Integer) : Integer
if i = ol.Length then
Exit(1)
nPerms := ol[i].Permutationen.Length
for j = 0 to nPerms - 1 do
nUnterkombis := Kombis(kz+j, sz + nPerms, i + 1)
for kz' = kz + j to kz + nUnterkombis - 1 do
Kopiere permutation nach [kz',sz]
Exit(nPerms * nUnterkombis)
Keine Ahnung, ob das verständlich ist, also mal ein Beispiel
:
Wir haben zwei Priolisten [a,b] und [c,d]. Wir beginnen bei Kombis(0, 0, 0): nPerms von [a,b] ist 2, die erste Permutation der ersten Liste ist [a,b] und wir rufen Kombis(0, 2, 1) auf.
Darin ist nPerms wieder 2, die erste Permutation [c,d]. Für diese rufen wir Kombis(0, 4, 2) = 1 auf, kopieren [c,d] also nur nach [kz+j=0, 2].
Für [d,c] ist kz+j = 1, unterkombis wieder 1, also wird nach [1,2] kopiert.
Code:
- - c d
- - d c
- - - -
- - - -
Wir kehren mit dem Ergebnis 2 * 1 zu i = 0 zurück, [a,b] wird also nach [0+0,0] und [0+1,0] kopiert.
Code:
a b c d
a b d c
- - - -
- - - -
Weiter geht's mit [b,a]...