Naloge (rodbina) z rešitvami
Koliko žensk
Napiši funkcijo koliko_zensk(oseba), ki vrne število žensk v
rodbini osebe oseba.
Ali je oseba oseba ženska, preverimo tako, da vprašamo
oseba.spol == "Ž".
(Vsak povpraša isto vprašanje vse otroke, rezultat sešteje in prišteje 1, če je on sam (točneje, ona sama) ženska.
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).
Vse 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).
Vse 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 predstavljal, 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 length(xs), ki izračuna dolžino seznama gnezdenih terk.
>>> length(())
0
>>> length((1, ()))
1
>>> length((5, (4, (6, (7, (1, ()))))))
5
Napiši funkcijo dup(xs), 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 reverse(xs), 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").