Autorské riešenie
Úloha sa dá riešiť viacerými postupmi, ktoré považujeme za rovnocenné:
Autorské riešenie: výpočet vzorcom, s podmienkami, cyklom a zoznamom - toto riešenie je elegantné, na málo riadkov a rovnoko obtiažne v jazykoch Imagine a Python. Rekurzia vyžaduje od programátora lepšie abstraktné myslenie, je to elegantné riešenie, ale rekurzia v niektorých vývojových prostrediach nebude fungovať vo väčšom počte krokov (nad 1000). Úloha je výpočtová. V programe najprv spracujme číselný vstup a číselný výstup. Neberieme do úvahy vstupy < 1, aby nedošlo k nedorozumeniu, pretože rok je radová číslovka, teda rok 0 nemá zmysel. Preto pre vstupy < 1 program vráti 0. Potom pre vstupy >= 1 vypočítame počet sadeníc podľa pravidiel. Úlohu si rozdeľme na čiastkové úlohy, najprv riešme len pravidlo 1, potom pridáme pravidlo 2, potom pravidlo 3 a nakoniec pravidlo 4. Je dobré vypočítať úlohu ručne na papier v tabuľke: číslo roku, použité pravidlá, prírastok v danom roku, úbytok v danom roku, celkový počet sadeníc v danom roku. Podľa tabuľky vieme, čo má program vypočítať. Do programu môžeme dočasne vložiť pomocné výpisy na obrazovku podľa tabuľky, alebo použiť krokovanie so sledovaním premenných. Vstup n je začiatok n-tého roku, posledný prírastok bol v roku n-1, celkový počet sadeníc platí pre začiatok n-tého roku). Vypočítavame prírastky sadeníc (plus) v každom roku od 1 po n-1 podľa zadaných pravidiel 1, 2, 3. Pravidlo 2: každý druhý rok (párny rok) určíme ako zvyšok po delení (modulo) číslom 2. Pravidlo 1 platí vtedy, keď neplatí pravidlo 2. Pridáme pravidlo 3 pomocou zvyšku po delení číslom 5. Celkový počet sadeníc (pocet) vypočítame ako súčet prírastkov v každom roku od 1 po n-1 a odpočítavame uhynuté sadenice v každom roku (minus). Pravidlo 4 riešime pomocou 5-prvkového zásobníka, kde držíme 5-ročnú históriu prírastkov. V každom roku prírastok (plus) pridáme na koniec zásobníka (minus). Od súčtu sadeníc sa odpočítava začiatok zasobníka a zásobník sa posunie doľava (začiatok sa vymaže, pridá sa na koniec). Do programu pridáme komentár pre vysvetlenie pomenovania premenných a postupu výpočtu. ;Imagine
logo
viem pocetSadenic :n urobTu "minus [0 0 0 0 1] urobTu "Pocet 0 ak :n>0 [ urobTu "Pocet 1 opakuj :n-1 [ urobTu "i pocitadlo ak2 zvysok :i 5 =0 [ urobTu "plus 0 ] [ ak2 zvysok :i 2 =0 [ UrobTu "plus :pocet*2 ] [ UrobTu "plus :pocet ] ] UrobTu "pocet (:pocet+:plus - (prvok 1 :minus)) urobTu "minus bezPr :minus urob "minus vlozPo :plus :minus ] ] pis (slovo "|Pocet sadenic:| :pocet) koniec #Python def pocetSadenic(n): ''' Funkcia vrati pocet sadenic v zadanom roku. :param n: cislo roku :type n: int :return: pocet sadenic :rtype: int ''' minus=[0,0,0,0,1] # zasobnik pre pocet uhynutych pocet=0 if n>0: pocet=1 for i in range(1,n): if i%5==0: # pravidlo 3 plus=0 elif i%2==0: # pravidlo 2 plus=pocet*2 else: # pravidlo 1 plus=pocet pocet+=plus-minus[0] # pravidlo 4 del minus[0] minus.append(plus) return pocet Vaše zaujímavé riešenia a najčastejšie chyby Ľahko sa da pomýliť v číslovaní rokov. Každý druhý rok má byť párny rok (2, 4, 6...). |
||||||||||
© Univerzita Pavla Jozefa Šafárika v Košiciach, Prírodovedecká fakulta, Ústav informatiky palmaj (zavinac) upjs.sk |