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]
Zadnja sprememba: petek, 24 november 2017, 22:28