ϵ">]>
5. CVIČENIE Z PREDMETU ÚVOD DO DEKLARATÍVNEHO PROGRAMOVANIA LS 2013/2014
ČASŤ B
http://dai.fmph.uniba.sk/courses/udp/ex/ex05.zip
Dátum: 18. a 19. 3. 2014
Odporúčaná verzia CL: 5.81.20
WWW stránka predmetu: http://dai.fmph.uniba.sk/courses/udp/
Kontakt: udp(zavináč)lists.dai.fmph.uniba.sk
Úvodná poznámka. Toto cvičenie je venované funkciám operujúcim na zoznamoch (ex05a), chvostovej rekurzii na zoznamoch (ex05b) a tuplingu zoznamových operácií (ex05c).
Literatúra.
[1] J. Kľuka. Prednášky z Úvodu do deklaratívneho programovania LS 2013/2014.
http://dai.fmph.uniba.sk/courses/udp/udp-prednasky-2014.pdf
[2] D. Guller. Poznámky k prednáškam z CL.
[3] J. Komara and P. J. Voda. Metamathematics of Computer Programming. 2001.
Funkciu, ktorá sčíta všetky prvky spájaného zoznamu by sme v Pythone mohli naprogramovať nasledovne:
def suml(xs): s = 0 while xs is not None: x, zs = xs.data, xs.next s = s + x xs = zs return s
Úloha. Simulujte uvedený cyklus dvojargumentovou chvostovorekurzívnou funkciou (viď ex03b a [1, III. prednáška, §7]) a použite ju na zadefinovanie funkcie .
Testovanie.
Suml_test = r:Results
Funkciu , ktorá obráti zoznam , sme v ex05a definovali takto:
Táto funkcia sa tiež dá vypočítať nasledovným pythonovským while cyklom s akumulátorom :
def rev(xs): rs = None while xs is not None: x, zs = xs.data, xs.next rs = Vrchol(x,rs) xs = zs # cyklus skončí, keď xs == None return rs
Tento program nepotrebuje zreťazenie. Navyše je efektívny: Na výpočet cyklu treba krokov, kde je dĺžka zoznamu . Naproti tomu na výpočet horeuvedenej definície treba rádovo krokov ( rekurzívnych volaní a v každom rádovo krokov na výpočet zreťazenia).
Úloha. Simulujte uvedený cyklus dvojargumentovou chvostovorekurzívnou funkciou a použite ju na zadefinovanie funkcie .
Testovanie.
Rev_test = r:Results
Odporúčanie. Na cvičeniach pokračujte riešením úloh z časti ex05c. K nasledujúcej úlohe sa vráťte, ak Vám ostane čas, alebo v rámci domácej prípravy.