Ogrevalna naloga: Obrni

Napišite funkcijo obrni(s), ki prejme niz in vrne isti niz, zapisan z desne proti levi. Tako mora, recimo, obrni("janez demšar") vrniti "rašmed zenaj".

Namig: obrnjen niz dobimo tako, da k obrnjenemu nizu brez prve črke prištejemo prvo črko. Torej, če hočeš obrniti "demšar", moraš obrniti "emšar" in k temu prišteti "d".

Funkcija mora biti rekurzivna. Rešitev def obrni(s): return s[::-1] ni pravilna.

Če je niz prazen, je tak tudi obrnjeni niz. Sicer pa obrnjen niz dobimo tako, da postavimo na začetek zadnjo črko in prištejemo obrnjen ostanek.

def obrni(s): if not s: return "" return s[-1] + obrni(s[:-1])

To je sicer nekoliko neobičajno: pobiranje s konca je v mnogih jezikih počasno, zato navadno naredimo ravno nasprotno. To je, obrnemo ves niz, razen prve črke, prvo pa prištejemo na koncu.

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

Obvezna naloga: Zrcalo

Napišite funkcijo zrcalo(s), ki dobi niz in vrne niz, ki vsebuje začetni niz, znak | in potem še enkrat začetni niz, vendar prezrcaljen.

Najboljše, da najprej poskrbite za prazen niz. Sicer pa je rešitev skoraj enaka kot rešitev ogrevalne naloga, le da prva črka ni samo na koncu, temveč tudi na začetku. (Upam, da nisem povedal preveč, čeprav sem povedal vse.)

Ker sem pozabil prepovedati, je bilo dovoljeno (in glede na to, da vam stalno ponavljam, da se naloge dopolnjujejo, ste si lahko upravičeno mislili, da je takšna rešitev pravzaprav zaželena): zrcalo lahko dobimo tako, da k nizu prištejemo | in še obrnjeni niz, torej

def zrcalo(s): return s + "|" + obrni(s)

V resnici pa ni bilo mišljeno tako. Upal sem, da boste (in mnogi tudi ste) prišli do te rešitve:

def zrcalo(s): if not s: return "|" return s[0] + zrcalo(s[1:]) + s[0]

Prazen niz zrcalimo tako, da dodamo le |. Če niz ni prazen, pa bo imel "zrcaljeni niz" na začetku in na koncu prvi znak, vmes pa prezrcaljeni ostanek niza.

Dodatna naloga: Sodi in lihi

Sodo-lihi seznami so seznami, v katerih se izmenjujejo soda in liha števila; začeti se morajo s sodim številom. Liho-sodi seznami so zelo podobna reč, le da se morajo začeti z lihim številom.

Z besedami, kakršne smo govorili na predavanjih: seznam je sodo-lih, če se začne s sodim številom, ostanek pa je liho-sodi seznam. In obratno.

Naloga zahteva, da napišete funkcijo sodi_lihi(s), ki vrne True, če je seznam sodo-lih in False, če ni. (Naloga sicer ne zahteva, da napišete tudi funkcijo lihi_sodi(s), vendar jo boste najbrž kljub temu napisali. ;)

Seznam je sodo-lih, če je prazen, ali pa je prva številka soda, ostanek pa je liho-sod (torej: začne se z liho in potem se izmenjujejo lihe in sode).

Seznam je liho-sod, če je prazen, ali pa je prva številka liha, ostanek pa je sodo-lih (torej: začne se s sodo in potem se izmenjujejo lihe in sode).

def sodi_lihi(s): return not s or s[0] % 2 == 0 and lihi_sodi(s[1:]) def lihi_sodi(s): return not s or s[0] % 2 == 1 and sodi_lihi(s[1:])
Ultime modifiche: mercoledì, 18 marzo 2015, 21:30