Kolikokrat ime

Napiši funkcijo kolikokrat_ime(oseba, crka), ki pove, kolikokrat se v rodbini osebe oseba pojavijo imena, ki se začnejo z določeno črko. Če pokličemo, recimo kolikokrat_ime(adam, "A"), mora funkcija vrniti 3, saj so v Adamovi rodbini tri osebe, katerih ime se začne s črko A (Adam, Alenka in Aleksander).

Vsa rodbina določene osebe

Napiši funkcijo vsa_rodbina(oseba), ki vrne množico (set) z vso rodbino podane osebe (vključno z njo samo).

Vso potomstvo določene osebe

Napiši funkcijo vse_potomstvo(oseba), ki vrne množico (set) potomcev podane osebe (brez te osebe).

Kako daleč je Elizabeta?

Na predavanjih smo se naučili, kako neko osebo vprašamo, ali v njegovi rodbini obstaja oseba z določenim imenom. Zdaj bi radi naredili nekaj več: napiši funkcijo kako_dalec(oseba, ime), ki pove, kako globoko v rodbini osebe oseba je oseba z imenom ime. Če, recimo, vprašamo Elizabeto, kako daleč je do Jurija, naj reče 1, saj je to njen sin. Razdalja do Jožefa (vnuka) je 2, do pravnukov Alenke, Petra in Aleksandra pa 3. Razdalja od Elizabete do Elizabete je 0.

Če vprašamo, kako daleč je od Elizabete do Tadeje, naj vrne None.

Pot do Elizabete

Ta naloga je nekoliko težja ... a ne preveč.

Reši podobno nalogo, kot je prejšnja, le da naj funkcija - poimenujmo jo pot_do(oseba, ime) ne vrne razdalje do določene osebe, temveč pot do nje. Če Elizabeto vprašamo za pot do Aleksandra, naj vrne ["Elizabeta", "Jurij", "Jožef", "Aleksander"].

Spet si najprej predstavljaj, kako bi igral to igro s kolegi.

Še malo matematike...

Gnezdena vsota

Napiši funkcijo vsota2(xs), ki sešteje elemente vgnezdenega seznama (seznama, ki vsebuje tudi podsezname). Pomagajte si s funkcijo isinstance(x, tip), ki pove, ali je podani x tipa tip

>>> isinstance([1, 2, 3], list)
True
>>> isinstance(1, list)
False
>>> vsota2([])
0
>>> vsota2([1, 2, 3, 4, 5])
15
>>> vsota2([1, [], [2, 3, [4]], 5])
15

Namig: vsota elementov seznama je enaka vsoti vsot podseznamov + vsota elementov, ki niso podseznami. Se pravi, pojdi čez elemente seznama (npr. for e in xs). Če vidiš, da gre za seznam (isinstance(e, list)), ga vprašaj, kakšna je njegova vsota (vključno z morebitnimi podseznami v njem); to prištej k skupni vsoti, ki jo računaš. Če pa ne gre za seznam, je to številka in jo preprosto prišteješ.

Kot vse druge, je tudi ta naloga bistveno lažja, kot se zdi.

Igranje s seznami

Spodnje naloge zabavajo tiste, ki jim je všeč rekurzija. Če vam je, se jih lotite. Tistim, ki je ne marajo, pa se zdijo duhamorne. Preskusite se, v katero skupino sodite! ;)

Včasih so programerji sestavljali sezname z gnezdenjem terk. Ubogi reveži, druge izbire niso imeli. Napiši funkcijo convert(xs), ki seznam xs pretvori v ta arhaični zapis.

>>> convert([])
()
>>> convert([1])
(1, ())
>>> convert([1, 2])
(1, (2, ()))
>>> convert([5, 4, 6, 7, 1])
(5, (4, (6, (7, (1, ())))))

Napiši funkcijo, ki izračuna dolžino seznama gnezdenih terk.

>>> length(())
0
>>> length((1, ()))
1
>>> length((5, (4, (6, (7, (1, ()))))))
5

Napiši funkcijo, ki ponovi vsak element seznama.

>>> dup((1, (2, ())))
(1, (1, (2, (2, ()))))
>>> dup((5, (4, (6, (7, (1, ()))))))
(5, (5, (4, (4, (6, (6, (7, (7, (1, (1, ()))))))))))

Napiši funkcijo, ki obrne seznam.

>>> reverse((5, (4, (6, (7, (1, ()))))))
(1, (7, (6, (4, (5, ())))))

Če ta take naloge zabavajo jih na internetu najdeš še veliko več.

Izpis direktorijev

Funkcija os.listdir(ime_direktorija) vrne seznam z imeni vseh datotek v podanem direktoriju. Nekatera od teh imen predstavljajo datoteke, nekatera pa, morda, direktorije. Funkcija os.path.isdir(ime) pove, ali je ime ime datoteke ali direktorija.

Napišite funkcijo izpisi_datoteke(ime_direktorija), ki izpiše imena vseh datotek v direktoriju ime_direktorija in v vseh njegovih poddirektorijih, direktorijih poddirektorijev.

Za to nalogo ni testov. Preskušajte jo na direktorijih na svojem računalniku.

Namig: to je spet isto kot rodovnik...

Nasvet: recimo, da imamo direktorij "x" in os.listdir("x") vrne (med drugim) ime "y". Da bi izvedeli, ali je "y" direktorij ali datoteka, moramo poklicati os.path.isdir(os.path.join("x", "y")) in ne le os.path.isdir("y").


Zadnja sprememba: torek, 31. marec 2026, 10.49