Ich hätte da einen iterativen Ansatz ohne Rekursion zu bieten:
Delphi-Quellcode:
procedure Kombinatorik(N: Integer; HandleArray: TProc<TArray<Integer>>);
var
arr: TArray<Integer>;
begin
SetLength(arr, N);
{ Triviale Startkombination }
arr[0] := N;
HandleArray(arr);
var idx := 0;
repeat
if idx < High(arr)
then begin
{ Schiebe einen Zähler um eine Stelle nach rechts }
Dec(arr[idx]);
Inc(idx);
Inc(arr[idx]);
HandleArray(arr);
end
else begin
{ Letzte Stelle: Merke und lösche den Übertrag }
var K := arr[idx];
arr[idx] := 0;
{ Suche den den größten Index mit einem Wert > 0.
Gibt es keinen sind wir fertig.}
repeat
Dec(idx);
if idx < 0
then
Exit;
until arr[idx] > 0;
{ Setze den Übertrag in die nächste Stelle (muss 0 enthalten) }
arr[idx + 1] := k;
{ Im weiteren Verlauf wird wieder ein Zähler von idx auf den Übertragswert geschoben }
end;
until False;
end;
Das Ergebnis sieht dann so aus:
Code:
4 0 0 0
3 1 0 0
3 0 1 0
3 0 0 1
2 2 0 0
2 1 1 0
2 1 0 1
2 0 2 0
2 0 1 1
2 0 0 2
1 3 0 0
1 2 1 0
1 2 0 1
1 1 2 0
1 1 1 1
1 1 0 2
1 0 3 0
1 0 2 1
1 0 1 2
1 0 0 3
0 4 0 0
0 3 1 0
0 3 0 1
0 2 2 0
0 2 1 1
0 2 0 2
0 1 3 0
0 1 2 1
0 1 1 2
0 1 0 3
0 0 4 0
0 0 3 1
0 0 2 2
0 0 1 3
0 0 0 4