Začetna vaje iz rekurzije
Imejmo poljubno celo število v seznamu v seznamu v seznamu ... v seznamu,
poljubno mnogokrat. Takšni strukturi bomo rekli babuška.
Primeri babušk so 13, [473], [[[[21]]]], [[7]], itd.
Sestavi funkcijo babuska(par),
ki za parameter dobi takšno babuško ter vrne število seznamov, v katere je
zaprto celo število. Za zgornje primere so rezultati 0, 1, 4 in 2.
Predpostavi, da je struktura pravilna, torej res opisana kot zgoraj!
def babuska(mojaB): '''Vrne število seznamov, v katere je zaprto celo število ''' if isinstance(mojaB, int) : # ustavitveni pogoj - opraviti imamo s celim številom return 0 # imamo torej vsaj eno zunanjo lupino znotraj = mojaB[0] # odluščimo # in preštejemo koliko jih je znotraj koliko = babuska(znotraj) return 1 + koliko
Sestavi funkcijo kdoSeSkriva(par),
ki za parameter dobi takšno babuško ter vrne zaprto celo število.
Predpostavi, da je struktura pravilna, torej res opisana kot zgoraj!
Pri reševanju boste morali preveriti, kakšnega tipa je podatek. V
ta namen v ukazni lupini preizkusite naslednje ukaze:
isinstance(12, int)
x = 3.5
isinstance(x, float)
isinstance(x, int)
isinstance(x, (int, float))
isinstance(3, str)
isinstance("3", str)
isinstance([], list)
s = [2, [3]]
isinstance(s, list)
isinstance(s[0], list)
isinstance(s[0], int)
isinstance(s[1], int)
isinstance(s[1], list)
isinstance(s[1][0], int)
def kdoSeSkriva(mojaB): '''Vrne število seznamov, v katere je zaprto celo število ''' if isinstance(mojaB, int) : # število ni skrito! return mojaB # imamo torej vsaj eno zunanjo lupino znotraj = mojaB[0] # odluščimo # in poglejmo, kaj je znotraj kdo = kdoSeSkriva(znotraj) return kdo
Napišite rekurzivno funkcijo dolzina, ki sprejme niz in izračuna njegovo dolžino.
Niz je sestavljen samo iz črk in števk. Dolžino izračunajte po takšnem pravilu:
vsaka števka k dolžini prispeva svojo vrednost, vsaka črka pa 1 (kot običajno).
Primeri:
>>> dolzina('5a')
6
>>> dolzina('abcde12345')
20
V funkciji ne smete uporabiti zanke while ali zanke for!
Pri ugotavljanju, ali gre za črko ali števko si pomagajte s funkcijama isalpha() in isdigit().
Na primer:
>>> 'a'.isalpha()
True
>>> '5'.isdigit()
True
def dolzina(s): '''Izračun drugačne dolžine niza''' if s == "": return 0 # razbijemo na prvi znak in preostanek (rep) prviZnak = s[0] rep = s[1:] dolzinaRepa = dolzina(rep) # kako prištejemo prvi znak if prviZnak.isalpha(): return 1 + dolzinaRepa elif prviZnak.isdigit(): return int(prviZnak) + dolzinaRepa def dolzinaV2(niz): '''vrne "dolzino" niza, kjer je dolžina def. nekoliko drugače''' if niz == '': return 0 if len(niz) == 1 : # samo en znak v nizu if niz.isdigit() : # in to je števka return(int(niz)) return 1 # ni števka, je "navaden" znak # "dolzina" celega niza je "dolzina" niza, ki ga # sestavlja le prvi znak in "dolzine" preostanka return dolzina(niz[0]) + dolzina(niz[1:])
Seznam seznamov celih števil (SSCŠ) je seznam, katerega elementi so bodisi cela števila bodisi seznami seznamov celih števil. Da bo enostavneje, recimo, da je tudi prazen seznam SSCŠ. Nekaj primerov:
[-1, 2, -3]
[1, [2], 3, [2, 3, 4]]
[[[[2]], 1], [2, [[-3], [4]]]]
Sestavi funkcijo prestejStevila(sscs), ki prešteje, koliko je
v sscs celih števil. Za primere od zgoraj so rezultati:
3
6
5
def prestejStevila(sscs): if len(sscs) == 0 : # tudi prazen seznam je SSCS return 0 # in nima celih števil kolikoStevil = 0 # pregledamo vse elemente for el in sscs : # če je element 'običajno število' if isinstance(el, int): kolikoStevil += 1 else : # potem mora pa biti sscs in moramo prešteti vsa cela števila v njem kolikoVSSCS = prestejStevila(el) kolikoStevil += kolikoVSSCS return kolikoStevil
Sestavi funkcijo prestejNegativnaStevila(sscs), ki prešteje,
koliko je v seznamu seznamov negativnih celih števil.
Za primere od zgoraj so rezultati:
2
0
1
def prestejNegativnaStevila(sscs): if len(sscs) == 0 : # tudi prazen seznam je SSCS return 0 # in nima celih števil kolikoStevil = 0 # pregledamo vse elemente for el in sscs : # če je elemnt 'običajno število' if isinstance(el, int): if el < 0: # če je negativen, povečamo števec, drugače nič! kolikoStevil += 1 else : # potem mora pa biti sscs in moramo prešteti vsa neg. cela števila v njem kolikoVSSCS = prestejNegativnaStevila(el) kolikoStevil += kolikoVSSCS return kolikoStevil
Sestavi funkcijo sestejStevila(sscs), ki sešteje vsa cela števila
v seznamu seznamov celih števil. Za primere od zgoraj so rezultati:
-2
15
6
def sestejStevila(sscs): if len(sscs) == 0 : # tudi prazen seznam je SSCS return 0 # z vsoto 0 vsotaStevil = 0 # pregledamo vse elemente for el in sscs : # če je element 'običajno število' if isinstance(el, int): vsotaStevil += el # ga dodamo vsoti else : # če ni, pa mora biti sscs in njegovo vsoto dodamo skupni vsotaTegaEl = sestejStevila(el) vsotaStevil += vsotaTegaEl return vsotaStevil
Sestavi funkcijo jeSSCS(sscs), ki preveri
(vrne True oz. False), če je dan seznam res seznam seznamov celih števil.
def jeSSCS(sscs): if not isinstance(sscs, list): # če sploh ne gre za seznam return False if len(sscs) == 0 : # tudi prazen seznam je SSCS return True # pregledamo vse elemente for el in sscs : # če je element ni ne SSCS ne celo število if not isinstance(el, int) and \ not jeSSCS(el) : # ne SSCE return False # vsi testi OK return True
Sestavi funkcijo splosci(sscs), ki "splošči" seznam
seznamov celih števil, torej vrne navaden seznam celih števil,
ki so vsebovana v SSCŠ (v istem vrstnem redu). Za primere od zgoraj so rezultati:
[-1, 2, -3]
[1, 2, 3, 2, 3, 4]
[2, 1, 2, -3, 4]
def splosci(sscs): if len(sscs) == 0 : # prazen seznam je SSCS return [] # in vrnemo enakega noviSez = [] # pregledamo vse elemente for el in sscs : # če je element 'običajno število' if isinstance(el, int): noviSez.append(el) # ga dodamo seznamu else : # če ni, pa mora biti sscs in dodamo sploščeno različico splosceniDel = splosci(el) noviSez.extend(splosceniDel) return noviSez