Ogrevalna naloga: Brez potomcev

Napiši funkcijo brez_potomca(oseba), ki vrne poljubno osebo iz rodbine podane osebe, ki nima nobenega otroka. Če pokličemo brez_potomca(jurij), lahko vrne Franca, Alenko, Petro ali Aleksandra. Če pokličemo brez_potomca(matjaž), mora vrniti Tadejo.

Namig: to je lahko prav ta oseba. Če ni, pa naj vpraša kar prvega od svojih otrok.

Funkcije ni nujno potrebno napisati rekurzivno - vendar priporočam, da jo, saj vam bo to pomagalo pri prvi dodatni nalogi.

Namig pove vse. Samo tisto, kar piše, je potrebno ubesediti v Pythonu.

def brez_potomca(oseba): if not oseba.otroci: return oseba.ime else: return brez_potomca(oseba.otroci[0])

Če funkcije nočemo napisati rekurzivno, pa jo naredimo takole.

def brez_potomca(oseba): while oseba.otroci: oseba = oseba.otroci[0] return oseba.ime

Obvezna naloga: Starost najmlajšega člana rodbine

Napišite funkcijo najmlajsi_let(oseba), ki vrne starost najmlajšega člana rodbine podane osebe. Če pokličemo najmlajsi(jurij), mora vrniti 5, saj ima Aleksander 5 let. Če pokličemo najmlajsi(adam), vrne 3, saj je toliko stara Margareta.

def najmlajsi_let(oseba): naj = oseba.starost for otrok in oseba.otroci: ta = najmlajsi_let(otrok) if ta < naj: naj = ta return naj

Oseba najprej predpostavi, da je ona sama najmlajša v rodbini (naj = oseba.starost. Nato vsakega otroka (for otrok in oseba.otroci) vpraša, koliko je star najmlajši član njegove rodbine (ta = najmlajsi_let(otrok)). Če je mlajši od najmlajšega doslej, si to zapomni.

Dodatna naloga (lažja)

Dopolni funkcijo brez_potomca. Imenujmo jo brez_potomcev(oseba), vrniti pa mora množico imen vseh oseb iz rodbine podane osebe, ki nimajo potomcev. Če pokličemo brez_potomcev(jurij), mora vrniti {"franc", "alenka", "petra", "aleksander"}. Če pokličemo brez_potomcev(matjaž), mora vrniti {"tadeja"}.

Namig: ta naloga res ni težka, čeprav je dodatna. Če dotična oseba nima otrok, vrne množico z lastnim imenom. Sicer kliče otroke in vrne unijo množic, ki jo dobi od otrok.

Namig spet pove vse.

def brez_potomcev(oseba): if not oseba.otroci: return {oseba.ime} brez = set() for otrok in oseba.otroci: brez |= brez_potomcev(otrok) return brez

Dodatna naloga (malo težja)

Spremeni funkcijo najmlajsi_let. Imenujmo jo najmlajsi(oseba), vrne pa naj ime najmlajšega člana rodbine.

Namig: za začetek napiši raje funkcijo najmlajsi0(oseba), ki naj vrne par (starost, ime) za najmlajšega člana rodbine. Funkcija najmlajsi naj pokliče funkcijo namlajsi0 in vrne drugi element iz para.

Kar namiguje namig, mora pogosto početi, ko programiramo rekurzivne funkcije. Problem je v tem, da pri klicu včasih potrebujemo malo več informacije, ko jih dobi prava, "zunanja" funkcija; zato naredimo neko dodatno funkcijo z dodatnimi argumenti. No, tule ne potrebujemo dodatnih argumentov, pač pa mora rekurzivna funkcija, ki jo kličemo, poleg imena (ki ga hočemo vrniti in ga potrebujemo zato) vračati tudi starost, saj je to tisto, kar opazujemo (primerjamo) ob rekurziji. Dodatno funkcijo torej potrebujemo zato, da vračamo dodatni rezultat; zunanja funkcija ga preprosto vrže stran.

def najmlajsi0(oseba): naj = oseba.starost, oseba.ime for otrok in oseba.otroci: ta = najmlajsi0(otrok) if ta < naj: naj = ta return naj def najmlajsi(oseba): return najmlajsi0(oseba)[1]
Last modified: Wednesday, 25 March 2015, 2:58 PM