Rekurencja z powrotami.
def change(left, nominals):
change_r(left, [], nominals)
def change_r(left, current, nominals):
for i, nominal in enumerate(nominals):
if left >= nominal:
change_r(left - nominal, current + [nominal], nominals[i:])
if left == 0:
print(current)
def main():
nominals = [10, 5, 2]
change(25, nominals)
main()
Lecimy po kolei po dostępnych nominałach i wybieramy największy który jest mniejszy lub równy reszcie do wydania. Odejmujemy go od reszty i powtarzamy to samo, ale dalej pracujemy tylko na nominałach mniejszych lub równych temu wybranemu (tzn jeśli np. wybraliśmy teraz 5
to w kolejnym wywołaniu bierzemy pod uwagę już tylko nominały 5
oraz 2
). Do niższego wywołania przekazujemy też listę już wybranych nominałów.
Jeśli jesteśmy na dnie rekurencji i pozostało nam do wydania 0
to wypisujemy aktualny wynik.