Obrni seznam

Napišite rekurzivno funkcijo obrni(xs), ki obrne seznam. Na primer, klic obrni([1, 2, 3, 4, 5]) mora vrniti seznam [5, 4, 3, 2, 1].

Rešitev

def obrni(xs):
    if not xs:
        return []
    return obrni(xs[1:]) + [xs[0]]

Dolžina seznama

Napišite rekurzivno funkcijo dolzina(xs), ki vrne dolžino seznama. Na primer, klic funkcije dolzina([1, 2, 3, 4,]) vrne vrednost 4.

Rešitev

def dolzina(xs):
    if not xs:
        return 0
    return dolzina(xs[1:]) + 1

Iskanje elementa

Napiši rekurzivno funkcijo vsebuje(s, x), ki pove, ali seznam s vsebuje element x. V primeru, da s vsebuje element x funkcije vrne True drugače pa False.

Seznam vsebuje element x, če s ni prazen in je bodisi prvi element s enak x, bodisi ostanek seznama vsebuje x.

Rešitev

def vsebuje(s, x):
    if not s:
        return False
    return s[0] == x or vsebuje(s[1:], x)

Najmanjša vrednost

Napišite rekurzivno funkcijo najmanjsa(xs), ki vrne najmanjšo vrednost v seznamu xs. Klic funkcije najmanjsa([5, 2, 2, -1, 3]) naj vrne -1.

Najmanjšo vrednost v seznamu dobimo tako, da izberemo manjšo izmed prve vrednosti v seznamu in najmanšo vrednostjo v preostanku seznama.

Rešitev

def najmanjsa(xs):
    if len(xs) == 1:
        return xs[0]
    return min(xs[0], najmanjsa(xs[1:]))

Enaka seznama

Napiši rekurzivno funkcijo enaka(s, t), ki pove (s True ali False) ali sta dva seznama enaka ali ne. Dva seznama sta enaka, če sta oba prazna ali pa sta oba neprazna in imata enaka prva elementa in sta enaka tudi ostanka seznama (vse razen prvega elementa).

Pri tej nalogi predvidite, da bosta seznama vedno enako dolga. Tisti, ki pa ste za dodaten izziv pa jo sprogramirajte tako, da deluje tudi v primeru, ko sta seznama različno dolga (pri tem ne uporabite funkcije len za primerjavo dolžin).

Rešitev

def enaka(s, t):
    if not s and not t:
        return True
    return s[0] == t[0] and enaka(s[1:], t[1:])

Naraščajoči seznam

Napišite rekurzivno funkcijo narascajoci(s), ki vrne True, če je podani seznam naraščajoč, in False, če ni.

Seznam je naraščajoč, če je prvi element manjši od drugega in če je naraščajoč tudi seznam od drugega elementa naprej. Poleg tega so seveda naraščajoči vsi seznami z manj kot dvema elementoma.

Rešitev

def narascajoci(s):
    if len(s) < 2:
        return True
    return s[0] < s[1] and narascajoci(s[1:])

Največji skupni delitelj

Napiši funkcijo gcd(a, b), ki izračuna največji skupni delitelj števil a in b. Na primer, največji skupni delitelj števil 8 in 12 je 4.

Največji skupni delitelj bom računali z Evklidovim alogoritmom, ki je v primeru, da sta a in b oba pozitivna, definiran takole:

gcd(a,a) = a,
gcd(a,b) = gcd(a-b, b); če je a > b
gcd(a,b) = gcd(a, b-a);  če je b > a

Torej v primeru, da sta a in b enaki števili, je največji skupni delitelj kar a. V primeru, da je a večji kot b, največji skupni delitelj najdemo tako, da izračunamo največjega skupnega delitelja števil a-b in b. V primeru, da je b večji od a, pa dobimo največjega skupnega delitelja tako, da izračunamo največji skupni delitej števil a in b-a.

Rešitev

def gcd(a, b):
    if a == b:
        return a
    elif a > b:
        return gcd(a-b, b)
    else:  # a < b
        return gcd(a, b-a)

Fakulteta

Napišite funkcijo fakulteta(x), ki na rekurzivni način izračuna fakulteto števila x.

Fakulteto n! navadno računamo kot produkt n števil; 5! = 1*2*3*4*5. Lahko pa bi jo definirali tudi takole: n! = n (n – 1)! Če jo lahko tako definiramo - pa jo tako še sprogramirajmo!

Da se stvar izteče, se moramo dogovoriti še, da je 0! enako 1.

Rešitev

def fakulteta(n):
    if n == 0:
        return 1
    return n*fakulteta(n-1)

Preverjanje Fibonacija

Zaporedje je Fibonacijevo, če je vsak člen enak vsoti prejšnjih dveh.

Seznam vsebuje Fibonacijevo zaporedje, če ima manj kot tri elemente ALI pa je zadnji element vsota predzadnjih dveh in je tudi seznam brez zadnjega elementa Fibonacijev.

Napiši rekurzivno funkcijo je_fibo(s), ki preveri, ali podani seznam vsebuje Fibonacijevo zaporedje.

Primer seznama, ki vsebuje Fibonacijevo zaporedje: [1, 1, 2, 3, 5, 8, 13].

Rešitev

def je_fibo(s):
    if len(s) < 3:
        return True
    return s[-3] + s[-2] == s[-1] and je_fibo(s[:-1])

Zadnje liho

Napiši rekurzivno funkcijo zadnje_liho(s), ki vrne zadnje liho število v podanem seznamu ali None, če v njem ni lihih števil.

Rešitev

def zadnje_liho(s):
    if not s:
        return None
    if s[-1] % 2 == 1:
        return s[-1]
    return zadnje_liho(s[:-1])
Zadnja sprememba: torek, 9. januar 2024, 22.54