A lépcsős feladat legutóbb látott átfogalmazásában azt mondtuk, hogy a 6 számot írjuk fel egymást követő 1-esek és/vagy 2-esek összegeként.
Kis változtatással feltehetjük azt a kérdést is: hányféleképpen írható fel egy pozitív egész szám pozitív egész számok összegeként, ha megkülönböztetjük azokat az eseteket (is), amelyek csak a tagok sorrendjében különböznek.
Nem feltétlenül nyilvánvaló, hogy összesen 2n-1 ilyen lehetőség van, ahogyan az sem kézenfekvő, hogy hogyan lehet ezek mindegyikét felsorolni. Erre ad megoldást a következő (meglepően rövid) rekurzív program.
A megoldás helyességének végiggondolását ezúttal rábízzuk az olvasóra: ha átesett az algoritmus megértésén, akkor jutalmul ölébe pottyan a lehetőségek számáról szóló fenti állítás bizonyításának alapgondolata is…
def part(k, n, sum): if k<n: part(k+1, n, sum+[1]) part(k+1, n, sum+[sum.pop()+1]) elif k==n: print(sum, end=' ') part(1, 5, [1]) print()
Az alább (áttördelve) megjelenített kimenet egyúttal szép illusztráció a lexikografikus rendezésre is.
[1, 1, 1, 1, 1] [1, 1, 1, 2] [1, 1, 2, 1] [1, 1, 3] [1, 2, 1, 1] [1, 2, 2] [1, 3, 1] [1, 4] [2, 1, 1, 1] [2, 1, 2] [2, 2, 1] [2, 3] [3, 1, 1] [3, 2] [4, 1] [5]