Spet sodi (in lihi)
Ogrevanje: Obrni
Napiši rekurzivno funkcijo obrni(s), ki prejme seznam in vrne seznam z
elementi v obratnem vrstnem redu. Klic obrni([2, 4, 1, 18]) mora vrniti
seznam [18, 1, 4, 2].
Namig: če Python zajavka, da ne more seštevati int in list, se spomni,
da je s[5] peti element seznama s (recimo int, če gre za seznam
int-ov), [s[5]] pa seznam, ki vsebuje peti element seznama s. Če
hočeš seštevati sezname, potrebuješ sezname.
Rešitev
Če je seznam prazen, vrnemo kar ta seznam, torej
if not s:
return s
Če ni prazen, vrnemo obrnjen seznam brez prvega elementa, na konec pa prilepimo prvi element:
obrni(s[1:]) + [s[0]]
Celotna rešitev je torej
def obrni(s):
if not s:
return s
return obrni(s[1:]) + [s[0]]
Če se spomnimo, kako delujejo logični izrazi, pa pridemo do rokohitrske rešitve
def obrni(s):
return s and obrni(s[1:]) + [s[0]]
Če je s prazen, je neresničen in izraz se neha računati že pred and-om.
Če je neprazen, pa se izračuna in vrne, kar je desno od and-a.
Če ne razumete te, krajše rešitve, ni to nič hudega. Je tudi ni treba. :)
Obvezna naloga: Samo soda
Napiši rekurzivno funkcijo samo_soda(s), ki prejme seznam števil in vrne
nov seznam, ki vsebuje le soda števila iz seznama s, v enakem vrstnem redu.
Klic samo_soda([5, 1, 2, 4, 1, 0, 3, 7]) mora vrniti [2, 4, 0].
Namig: če je prvo število sodo, je seznam sodih števil sestavljen iz tega števila in seznama vseh sodih števil iz ostanka. Če prvo število ni sodo, pa je seznam vseh sodih števil sestavljen iz vseh sodih števil iz ostanka.
Rešitev
Namig je povedal vse. Ni kaj dodati.
def samo_soda(s):
if not s:
return s
if s[0] % 2 == 0:
return [s[0]] + samo_soda(s[1:])
else:
return samo_soda(s[1:])
Rokohitrska varianta je tokrat malo bolj kriptična.
def samo_soda(s):
return s and [s[0]] * (1 - s[0] % 2) + samo_soda(s[1:])
Kogar zanima, naj jo razmisli.
Dodatna naloga: Vsoti sodih in lihih
Na predavanjih smo napisali funkcijo, ki prejme seznam in vrne vsoto njegovih elementov.
Napiši funkcijo vsoti(s), ki vrne terko z vsoto vseh sodih in vseh lihih
elementov seznama. Kic vsoti([2, 4, 1, 3, 8]) mora vrniti (14, 4), saj je
2 + 4 + 8 = 14 in 1 + 3 = 4.
Rešitev
Če je seznam prazen, vrnemo 0, 0.
Sicer pa pokličemo funkcijo na ostanku, trenutno število pa prištejemo k prvemu ali k drugemu elementu terke, ki jo vrnemo.
def vsoti(s):
if not s:
return 0, 0
sodi, lihi = vsoti(s[1:])
if s[0] % 2 == 0:
return sodi + s[0], lihi
else:
return sodi, lihi + s[0]