Vse z rekurzijo
Zahteve zaključka
# Naloga 1: Blagajna
def blagajna(s, caka=0):
if not s:
return caka
if s[0] == "+":
caka += 1
else:
caka -= 1
return max(caka, blagajna(s[1:], caka))
# Naloga 2: Kockarji
#
# Tule potrebujemo dve pomožni funkciji: ena sestavi seznam, koliko šestic je
# vrgel kateri kockar. Druga v tem seznamu poišče tistega, ki jih je vrgel
# največ.
# "Prava" funkcija smo pokliče tidve funkciji.
def prestej_sestice(s, n, kdo):
if not s:
return [0] * n
sestic = prestej_sestice(s[1:], n, (kdo + 1) % n)
if s[0] == 6:
sestic[kdo] += 1
return sestic
def najvecji(s, i):
if not s:
return 0, 0
koliko, kdo = najvecji(s[1:], i + 1)
if s[0] > koliko:
return s[0], i
else:
return koliko, kdo
def kockarji(s, n):
return najvecji(prestej_sestice(s, n, 0), 1)[1]
# 3. naloga
def enaka(s, t):
return not s and not t or s and t and s[0] == t[0] and enaka(s[1:], t[1:])
# 4. naloga
#
# Tule obakrat potrebujemo pomožno funkcijo. Rekurzija ne zna dobro hoditi po
# slovarjih, zato napišemo funkcijo vsi_deli_r, ki namesto slovarja potrebnih
# reči dobi seznam parov (reč, količina). "Prava" funkcija pokliče to funkcijo.
def vsi_deli_r(skatla, potrebno):
return (not potrebno # ne potrebujemo nicesar vec
or potrebno[0][0] in skatla # naslednja stvar je v skatli
and skatla[potrebno[0][0]] >= potrebno[0][1] # v dovoljsnji kolicini
and vsi_deli_r(skatla, potrebno[1:])) # pa tudi vsi drugi deli so v skatli
def vsi_deli(skatla, potrebno):
return vsi_deli_r(skatla, list(potrebno.items()))
def kaj_manjka_r(skatla, potrebno):
if not potrebno:
return {}
manjka = kaj_manjka_r(skatla, potrebno[1:])
rec, kolicina = potrebno[0]
if rec in skatla:
if skatla[rec] < kolicina:
manjka[rec] = kolicina - skatla[rec]
else:
manjka[rec] = kolicina
return manjka
def kaj_manjka(skatla, potrebno):
return kaj_manjka_r(skatla, list(potrebno.items()))
def blagajna(s, caka=0):
if not s:
return caka
if s[0] == "+":
caka += 1
else:
caka -= 1
return max(caka, blagajna(s[1:], caka))
# Naloga 2: Kockarji
#
# Tule potrebujemo dve pomožni funkciji: ena sestavi seznam, koliko šestic je
# vrgel kateri kockar. Druga v tem seznamu poišče tistega, ki jih je vrgel
# največ.
# "Prava" funkcija smo pokliče tidve funkciji.
def prestej_sestice(s, n, kdo):
if not s:
return [0] * n
sestic = prestej_sestice(s[1:], n, (kdo + 1) % n)
if s[0] == 6:
sestic[kdo] += 1
return sestic
def najvecji(s, i):
if not s:
return 0, 0
koliko, kdo = najvecji(s[1:], i + 1)
if s[0] > koliko:
return s[0], i
else:
return koliko, kdo
def kockarji(s, n):
return najvecji(prestej_sestice(s, n, 0), 1)[1]
# 3. naloga
def enaka(s, t):
return not s and not t or s and t and s[0] == t[0] and enaka(s[1:], t[1:])
# 4. naloga
#
# Tule obakrat potrebujemo pomožno funkcijo. Rekurzija ne zna dobro hoditi po
# slovarjih, zato napišemo funkcijo vsi_deli_r, ki namesto slovarja potrebnih
# reči dobi seznam parov (reč, količina). "Prava" funkcija pokliče to funkcijo.
def vsi_deli_r(skatla, potrebno):
return (not potrebno # ne potrebujemo nicesar vec
or potrebno[0][0] in skatla # naslednja stvar je v skatli
and skatla[potrebno[0][0]] >= potrebno[0][1] # v dovoljsnji kolicini
and vsi_deli_r(skatla, potrebno[1:])) # pa tudi vsi drugi deli so v skatli
def vsi_deli(skatla, potrebno):
return vsi_deli_r(skatla, list(potrebno.items()))
def kaj_manjka_r(skatla, potrebno):
if not potrebno:
return {}
manjka = kaj_manjka_r(skatla, potrebno[1:])
rec, kolicina = potrebno[0]
if rec in skatla:
if skatla[rec] < kolicina:
manjka[rec] = kolicina - skatla[rec]
else:
manjka[rec] = kolicina
return manjka
def kaj_manjka(skatla, potrebno):
return kaj_manjka_r(skatla, list(potrebno.items()))
Zadnja sprememba: četrtek, 5. marec 2015, 21.39