Ich bau solche Ziehungen auch fast nur iterativ auf, v.a. um Aufrufe zu verhindern.
Hier noch ein rekursiver direkter Ansatz (also ohne die "Ziehen ohne Zurücklegen" Überlegung).
[Damit man bei solchen Aufgaben das
Rad nicht immer neu erfinden muss, lohnt es sich ein paar kombinatorische Aufgaben wie "Ziehen mit/ohne Zurücklegen", Permutationen etc. zu programmieren. Durch geschickte Parameterwahl kann man dank einer solchen Sammlung die meisten Probleme mit einer Zeile Code lösen.]
Delphi-Quellcode:
procedure af( rest : integer; var A: array of Integer; elnr : integer; var res : TStringList );
var i, j : integer;
s : string;
begin
if elnr = High(A) then // letzte Position in A erreicht
begin
s := '';
A[elnr] := rest; // wir schreiben den Rest der Summe
// und speichern A in res ab:
for j := 0 to High(A) do s := s + A[j].ToString + ' ';
res.Add(s);
end else
for i := 0 to rest do
begin
// an Postion elnr sind noch die Werte 0..rest möglich
A[elnr] := i;
// danach können wir noch rest-i auf die Elemente A[elnr+1] .. A[High(A)] verteilen:
af(rest-i, A, elnr+1, res);
end;
end;
....
res := TStringList.Create;
Setlength(A,v);
af(s,A,0,res);
ShowMessage( res.Text );
res.free;