Megfogalmazhattuk volna úgy is a lépcsős feladatot, hogy írjuk fel a 6-ot egymást követő 1-esek és/vagy 2-esek összegeként (megkülönböztetve azokat az eseteket is, amikor csak a tagok sorrendje különbözik).
> A fenti megközelítés szerint célszerűbb lehet az utakat az egymást követően átlépett fokok számával megadni; erre mutatnak példát az alábbi programok.
Első körben különböztessük meg a kétféle lépési lehetőséget: adja meg a függvény, hogy a k. lépésről 1-et, illetve 2-t lépve milyen utak vezetnek az n. lépcsőfokra.
A kiindulási lépéssor természetesen most is lehetne az üres string; azért írtunk ehelyett szóközt, hogy az eredmény szépen igazodjék az előző megoldás kimenetéhez:
def ms_2311_012_01b(k, f, n, path): if k<=n: k+= f path+= str(f) if k<n: ms_2311_012_01b(k, 1, n, path) ms_2311_012_01b(k, 2, n, path) elif k==n: print(path, end=' ') ms_2311_012_01b(0, 1, 6, ' ') ms_2311_012_01b(0, 2, 6, ' ') print()
A két legutóbbi megoldás kimenete egymás alatt:
0123456 012346 012356 012456 01246 013456 01346 01356 023456 02346 02356 02456 0246 111111 11112 11121 11211 1122 12111 1212 1221 21111 2112 2121 2211 222
Végül hagyjuk el a paraméterek közül az átlépett fokok számát megadó másodikat, s lássunk két lehetséges megfogalmazásra két lehetséges függvényt.
I. Tudva azt, hogy a k. lépcsőfokra milyen út vezet, írassuk ki az n. lépcsőfokra vezető utakat: ha k<n, akkor léphetünk egyet vagy kettőt; ha k=n, akkor készen vagyunk.
def ms_2311_012_01c(k, n, path): if k<n: path+= '1' ms_2311_012_01c(k+1, n, path) path= path[:-1]+'2' ms_2311_012_01c(k+2, n, path) elif k==n: print(path, end=' ') ms_2311_012_01c(0, 6, ' ') print()
II. Tudva azt, hogy a k. lépcsőfokra milyen út vezet, s tudva, hogy még l lépcsőfok van hátra, írassuk ki a lehetséges utakat: ha l negatív, nincs teendő; ha l nulla, készen vagyunk; egyébként lépjünk egyet vagy kettőt.
def ms_2311_012_01d(k, l, path): if l<0: return elif l==0: print(path, end=' ') return path+= '1' ms_2311_012_01d(k+1, l-1, path) path= path[:-1]+'2' ms_2311_012_01d(k+1, l-2, path) ms_2311_012_01d(0, 6, ' ') print()
A kimenet mindkét esetben ugyanaz, mint legutóbb:
111111 11112 11121 11211 1122 12111 1212 1221 21111 2112 2121 2211 222