# Prvotna rešitev SteviloZBesedami iz učne enote o nizih ima veliko klicev
# return. Načeloma bi morali zdaj pri vsakem od njih še poskrbeti, da se
# rezultat najprej tudi shrani v slovar. Temu se lahko elegantno izognemo
# tako, da razdelimo funkcijo na dva dela: ena funkcija (spodaj se imenuje
# _SteviloZBesedami) izračuna rezultat, druga (spodaj se imenuje
# SteviloZBesedami – to je tista, ki jo bo uporabnik zares poklical) pa ga
# shrani v slovar in posreduje uporabniku.
# Slovar za pomnjenje rešitev.
h = {}
# "Interna" funkcija _SteviloZBesedami je čisto enaka kot funkcija
# SteviloZBesedami iz rešitve 9. naloge v učni enoti o nizih, le ime smo ji
# spremenili. Paziti moramo na to, da pri rekurzivnih klicih še vseeno kliče
# funkcijo SteviloZBesedami (ki bo znala izkoristiti rezultate iz slovarja,
# če so na voljo).
def _SteviloZBesedami(n, dve = True):
enice = ["nic", "ena", "dva", "tri", "stiri", "pet", "sest",
"sedem", "osem", "devet"]
if n == 2 and dve:
return "dve"
if n < 10:
return enice[n]
if n < 100:
if n == 10:
return "deset"
elif n == 20:
return "dvajset"
elif n % 10 == 0:
return enice[n // 10] + "deset"
elif n == 11:
return "enajst"
elif n < 20:
return enice[n % 10] + "najst"
else:
return enice[n % 10] + "in" + SteviloZBesedami(n - n % 10, False)
if n < 1000:
c = n // 100
s = "sto"
if c > 1:
s = SteviloZBesedami(c) + s
if n % 100:
s += " " + SteviloZBesedami(n % 100, dve)
return s
m = n // 1000
if m == 1:
s = ""
else:
s = SteviloZBesedami(m, False) + " "
s += "tisoc"
if n % 1000:
s += " " + SteviloZBesedami(n % 1000)
return s
def SteviloZBesedami(n, dve = True):
# Če imamo rešitev v slovarju, jo preberimo od tam. Ker ima funkcija dva
# parametra, moramo paziti na to, da kot ključ v slovarju uporabimo oba
# skupaj, saj je rezultat lahko odvisen od obeh, ne le od n.
if (n, dve) in h: return h[n, dve]
# Sicer jo izračunajmo zdaj.
rezultat = _SteviloZBesedami(n, dve)
# Shranimo jo v slovar in jo vrnimo.
h[n, dve] = rezultat
return rezultat
print(SteviloZBesedami(2002))
print(SteviloZBesedami(102002))
print(SteviloZBesedami(102102))
#for n in range(1, 10**6):
# print(SteviloZBesedami(n + 1))