Logo2 operace, rekurze, větvení výpočtu

Podobné dokumenty
ALGORITMIZACE PRAKTICKÉ

Prohledávání do šířky = algoritmus vlny

Něco málo o programu Imagine Logo

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Imagine Logo pokračování 1 Seznamy

Informatika 8. třída/6

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

2 Strukturované datové typy Pole Záznam Množina... 4

Algoritmizace a programování

Comenius Logo. Princip programování. Prostředí Comenius Logo

DUM č. 5 v sadě. 30. Inf-6 Imagine Logo a animace pro nižší gymnázium

2.1 Podmínka typu case Cykly Cyklus s podmínkou na začátku Cyklus s podmínkou na konci... 5

Programování v jazyku LOGO - úvod

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Lekce 01 Úvod do algoritmizace

Rekurze. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

DUM 06 téma: Tvorba makra pomocí VBA

Imagine práce se seznamy (stručný manuál)

Algoritmus. Přesné znění definice algoritmu zní: Algoritmus je procedura proveditelná Turingovým strojem.

ANOTACE vytvořených/inovovaných materiálů

Programovací jazyk Pascal

Algoritmizace a programování

Algoritmizace prostorových úloh

type Obdelnik = array [1..3, 1..4] of integer; var M: Obdelnik;

Řešení: PŘENESVĚŽ (N, A, B, C) = přenes N disků z A na B pomocí C

DUM č. 11 v sadě. 30. Inf-6 Imagine Logo a animace pro nižší gymnázium

Algoritmy a datové struktury

Implementace LL(1) překladů

Programujeme v softwaru Statistica

Comenius Logo. Úterý 20. března. Princip programování. Prostředí Comenius Logo

VISUAL BASIC. Přehled témat

NPRG030 Programování I, 2015/16 1 / :25:32

Rekurze. Jan Hnilica Počítačové modelování 12

Úvod do programování 10. hodina

PODPROGRAMY PROCEDURY A FUNKCE

Výroková logika II. Negace. Již víme, že negace je změna pravdivostní hodnoty výroku (0 1; 1 0).

Vzorce. StatSoft. Vzorce. Kde všude se dá zadat vzorec

Inovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh Jednoduché příkazy jazyka Pascal

- příkaz pohybující želvou zpět a o kolik. vlevo 45 vl 45 libovolně zadáme) směrem doleva. Na obrázku jsme pro

6 Příkazy řízení toku

Maturitní otázky z předmětu PROGRAMOVÁNÍ

4. Rekurze. BI-EP1 Efektivní programování Martin Kačer

Rekurze. Pavel Töpfer, 2017 Programování 1-8 1

Výpočet excentrického klikového mechanismu v systému MAPLE 11 Tomáš Svoboda Technická fakulta Česká Zemědělská Univerzita

Algoritmizace prostorových úloh

Rozklad problému na podproblémy

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

dovolují dělení velkých úloh na menší = dekompozice

DUM č. 9 v sadě. 30. Inf-6 Imagine Logo a animace pro nižší gymnázium

Výukový materiál Hardware je zaměřený především na výuku principů práce hardwaru a dále uvádí konkrétní příklady použití.

Paralelní programování

Rasterizace je proces při kterém se vektorově definovaná grafika konvertuje na. x 2 x 1

VYŠŠÍ ODBORNÁ ŠKOLA a STŘEDNÍ PRŮMYSLOVÁ ŠKOLA Mariánská 1100, Varnsdorf PROGRAMOVÁNÍ FUNKCE, REKURZE, CYKLY

Binární soubory (datové, typované)

Algoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

Sada 1 - Základy programování

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

Algoritmizace a programování. Ak. rok 2012/2013 vbp 1. ze 44

4 Želva se učí nové příkazy

4EK213 Lineární modely. 10. Celočíselné programování

Paměť počítače. alg2 1

Přednáška 3. Rekurze 1

Formální systém výrokové logiky

Prolog PROgramming in LOGic část predikátové logiky prvního řádu rozvoj začíná po roce 1970 Robert Kowalski teoretické základy Alain Colmerauer, David

INTERNETOVÉ ZKOUŠKY NANEČISTO - VŠE: UKÁZKOVÁ PRÁCE

Úvod do informatiky. Miroslav Kolařík

Algoritmizace. 1. Úvod. Algoritmus

Text úlohy. Která barva nepatří do základních barev prostoru RGB? Vyberte jednu z nabízených možností: a. Černá b. Červená c. Modrá d.

Programovací jazyky. imperativní (procedurální) neimperativní (neprocedurální) assembler (jazyk symbolických instrukcí)

Sémantika výrokové logiky. Alena Gollová Výroková logika 1/23

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

Programovací jazyky. imperativní (procedurální) neimperativní (neprocedurální) assembler (jazyk symbolických instrukcí)

K OZA SE PASE NA POLOVINĚ ZAHRADY Zadání úlohy

Syntaktická analýza. Implementace LL(1) překladů. Šárka Vavrečková. Ústav informatiky, FPF SU Opava

1 PRVOCISLA: KRATKY UKAZKOVY PRIKLAD NA DEMONSTRACI BALIKU WEB 1

Slepé prohledávání do šířky Algoritmus prohledávání do šířky Při tomto způsobu prohledávání máme jistotu, že vždy nalezneme koncový stav, musíme ale p

Základy algoritmizace a programování

Sada 1 - Základy programování

Algoritmizace prostorových úloh

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

Algoritmizace řazení Bubble Sort

Cykly. Základy programování 1 Martin Kauer (Tomáš Kühr)

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

MATEMATIKA základní úroveň obtížnosti

Funkce pokročilé možnosti. Úvod do programování 2 Tomáš Kühr

ALGORITMIZACE A PROGRAMOVÁNÍ

3 Co je algoritmus? Trocha historie Definice algoritmu Vlastnosti algoritmu... 3

Programování v C++, 2. cvičení

KMA/MDS Matematické důkazy a jejich struktura

V každém kroku se a + b zmenší o min(a, b), tedy vždy alespoň o 1. Jestliže jsme na začátku dostali 2

CVIČNÝ TEST 24. OBSAH I. Cvičný test 2. Mgr. Kateřina Nováková. II. Autorské řešení 6 III. Klíč 13 IV. Záznamový list 15

Stručný návod k programu Octave

5a. Makra Visual Basic pro Microsoft Escel. Vytvořil Institut biostatistiky a analýz, Masarykova univerzita J. Kalina

2. Svoje řešení pojmenujte podle čísel zadání úloh: uloha1.sgpbprj uloha4.sgpbprj

Algoritmizace. Obrázek 1: Přeložení programu překladačem

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Pointery II. Jan Hnilica Počítačové modelování 17

Transkript:

Operace Logo2 operace, rekurze, větvení výpočtu Je naše vlastní operace, jejím výsledkem je nějaká hodnota. Na určení tohoto výsledku musíme použít základní příkaz jazyka Imagine logo. A tím je výsledek. Vždy když program Imagine při vykonávání procedury najde příkaz výsledek, zastaví výpočet této procedury a hodnotu výrazu za příkazem výsledek vrátí jako výstup procedury. Příkaz výsledek má vlastně stejný význam jako příkaz. Příklad 1 Porovnáme dvě hodnoty a určíme, která je menší. Tu pak označíme jako min. Běžně se samozřejmě pracuje s větším množstvím čísel např. s poslouostí n čísel. Tento příklad je tu pro názornost. Příkaz min :a :b kdyžjinak :a < :b [výsledek :a] [výsledek :b] V Imagine logo existují tyto druhy operací číselné - logické - operace jejichž výsledkem je ano nebo ne, podmínky, predikáty Číselné operace Číselné operace jsou procedury s jedním, dvěma nebo více číselnými vstupy a číselným výsledkem. Tento výsledek lze, obdobně jako u funkcí v Delphi, použít pro jiné operace nebo příkaz jako jejich vstup např. logická operace, operace náhodně. Podmínkou může být jakákoliv operace, ať už základní nebo definovaná námi, která vyhodnotí určitou podmínku či vztah mezi svými vstupy a podle pravdivosti vrátí jako výsledek ano nebo ne. Logické operace Logické operace. Ty vykonávají bitové operace na celočíselných vstupech. Každý z níže vypsaných očekává jako svůj vstup jedno, dvě nebo i několik celých čísel. Jsou to - bitand bitnot bitor bitxor Některé další z logických operací umožňují kombinovat jednoduché podmínky a vytvářet z nich složitější. Vstupy pro tyto operace jsou logické hodnoty. Imagine nejprve vyhodnotí všechny vstuí výrazy a jejich hodnoty potom pošle jako vstupy operacím nebo,zároveň apod. např. zároveň číslo? :p prvočíslo? :p. 1

Nesmíme však zapomenout, že někdy je výhodnější nevyhodnocovat všechny vstuí výrazy napřed, ale až v té chvíli než je začne zpracovávat operace zároveň, nebo atd. Proč? Protože pokud by např. zadané prvočíslo nebylo číslo, je potom zbytečné vykonávat ostatní příkazy. Lepší je zadat celou podmínku v jiném tvaru a to - zároveň číslo? :p [prvočíslo? :p]. To znamená, že druhý výraz/příkaz se vyhodnotí až operací zároveň (t.j. ne před samotným jádrem Imagine)a to i v případě, jestliže je první hodnota slovo ano. Operace jejichž výsledkem je ano nebo ne Operace jejichž výsledkem je ano nebo ne, nazýváme podmínky nebo predikáty. Příkladem takovýchto podmínek jsou číselné operace <, >, <=, >=, <>, =, a nebo predikáty jako slovo? seznam? atd. Slovo ano znamená, že určitá podmínka je pravdivá. Ne pak znamená, že podmínka je nepravdivá. Některé procedury prostředí Imagine očekávají jako jeden ze svých vstupů buď ano nebo ne, když, když2 nebo otestuj, a získávají je testováním určitých podmínek. Procedury jako slovo? nebo stejné? prázdný? Jsou jednoduché základní podmínky. Někdy však potřebujeme otestovat/zjistit složitější podmínku složenou z více jednoduchých. Imagine má několik operací, kterými můžeme spojovat jednoduché podmínky do složitějších. Jsou jimi např. zároveň, nebo, není a xor. Příklady Příklad 2 Máme za úkol vykreslit na plochu obdelník. Pak necháme želvu libovolně chodit po ploše. Pokud se bude nacházet v obdelníku vypíše se do příkazového řádku Ano, pokud bude mimo obdelník vypíše se Ne. - želva příkaz lib.procházka.pozice:a:b // dvě proměnné a,b = strany obdelníka // pero nahoru do 20 vp lib // do libovolně, vpravo libovolně => želva si chodí kde chce tp! 3 // tloušťka pera číslo 3 kdyz nebo (abs poz < :a/2) // když nebo = buď nebo; (abs poz < :b/2) když je absolutní pozice želvy menší než polovina strany [pis "Ano.] a tak vypiš [Ano.] nebo i případě když je absolutní pozice želvy menší než strana b kdyz nebo (abs poz > :a/2) (abs poz > :b/2) [pis "Ne.] * 2 // opak když je absolutní pozice želvy větší než polovina strany a tak vypiš [Ne.].

Pokud bychom chtěli mít z této operace koncovou/ocasovou rekurzi, museli bychom zavolat operaci před koncem viz.*. Zápis - lib.procházka.pozice:a:b. Další variantu řešení najdete u větvení. Rekurze Definice rekurze Funkce, jejíž definice se odkazuje na sebe samu. Rekurzivní programy bývají stručnější a jednoduší pro pochopení než jiné modely, protože vystihují podstatu funkce. Zvláštním případem rekurze je iterace tzn. Rekurze se objevuje na začátku nebo konci sady instrukcí. Hloubka rekurze musí být konečná, ale ve skutečnosti i malá. Operuje na lineárních seznamech, stromech, grafech. Realizace rekurze Důležitým a účinným prostředkem na vyjádření rekurze v programování je procedura (nebo podprogram), které identifikátor slouží na rekurzivní aktivaci jejího těla. A podle zvoleného způsobu volání pak označujeme rekurzi buď jako přímou nebo nepřímou (viz. níže). Podmínky ukončení rekurze Protože u rekurzivních procedur je možnost nekonečných výpočtů, musíme se zaobírat my otázkou ukončení výpočtu. Základním požadavkem je, aby se rekurzivní volání procedury P řídilo podmínkou, která je za určité situace nesplnitelná. Např. dokud n > 0 opakuj Rozdělení rekurzí Rozeznáváme dva druhy rekurze - přímá rekurze procedura volá sama sebe - nepřímá rekurze procedura volá jinou proceduru a ta volá opět původní proceduru Kdy nepoužívat rekurzy Rekurzi bychom neměli používat, pokud již samotný charakter úlohy nevede přirozeným způsobem k rekurzivnímu řešení. Nesprávné a nevhodné je použití také tehdy, jestliže úlohu dokážeme stejně dobře, nebo dokonce i lépe řešit bez rekurze. V takovém případě je rekurze zbytečná a zpravidla vede jenom ke zvýšení časových a paměťových nároků programu při výpočtu. Naproti tomu se můžeme setkat s úlohami, které se pomocí rekurze řešily naprosto přirozeně a u nichž bylo použití rekurze zcela na místě. Jako příklad můžeme uvést techniku 3 prohledávání do hloubky včetně její aplikace při řešení grafových úloh na rekurzi je založena metoda rozděl a panuj, která se využívá například v některých třídících algoritmech. Výhody rekurze Hlavními výhodou rekurze je to, že -

- často poskytuje elegantnější a jednodušší řešení problému než u jiných nerekurzivních programů např. iterace - je mocným nástrojem pro řešení problémů, které jsou rekurzivně definovány - může být ekonomickým řešením problému, pokud není hloubka rekurzivního volání příliš velká - můžeme realizovat vše od matematických úloh až po obrazce - umožní zapsat podobně složité úlohy srovnatelně jednoduše, i jednodušeji pomocí rekurzivního algoritmu Nevýhody rekurze malá efektivita výpočtu - velké nároky na paměť Důvod je ten, že při každém volání rekurzivní procedury P vyžaduje procedura přidělení určitého množství paměti potřebné na lokální proměnné. Kromě těchto lokálních proměnných potřebujeme ještě paměť na uchování momentálního stavu výpočtu procedury. Praxe Pokud chceme psát jakýkoli program, a to i rekurzivní, musíme chápat jeho princip. Snad nejlépe se rekurze dá pochopit na rekurzivní proceduře na výpočet faktoriálu (n) nebo Fibonacciho čísla. Pokud tyto příklady chápete, tak vám psaní rekurze, ať už jakékoliv nebude dělat problémy. A nyní jeden z mnoha rekurzních příkladů z Imagine Loga. U každé operace je popis, co v programu vykoná. Další příklady naleznete na konci textu. Příklad 1 Náhodná procházka je jedna z nejvíce známých procedur v Imagine Logo. Želva má v tomto případě omezený prostor pro vykreslování. Samozřejmě můžeme želvu nechat chodit i volně, ale takto se dají vytvořit pěkné obrázky. Co má želva vykreslit vidíte na obrázku. Nezapomeňte želvu zneviditelnit. příkaz proch.kruh100 // libovolná procházka, kruh průměr 100 do lib vp lib // dopředu lib vpravo libovolně => želva si jde o náhodně zvolenou vzdálenost dopředu a o náhodně zvolený úhel doprava barvapera! "žlutá // nezapomínejte psát vykřičník a před barvou uvozovky 4 kdyz abs poz > 50 // pokud želva absolutní pozice želvy bude větší než 50 [bp! "červená] změní barvu pera na červenou kdyz abs poz > 101 // pokud absolutní pozice želvy bude větší než 101 želva se vrátí [domu barvapera! "žlutá] domu (do středu stránky)a barva pera se jí změní zpět na žlutou lib.procházka.kruh100 // zavoláním procedury A v proceduře A vytvoříme nikdy

nekončící rekurzi; tím že umístíme toto zavolání těsně před procedury vytvoříme rekurzi ocasovou Větvení Často potřebujeme při vytváření programu zajistit, aby se určité příkazy provedly jen tehdy, když je splněna nějaká podmínka. Podmínka = tvrzení, o kterém lze jednoznačně rozhodnout, zda je pravdivé či nepravdivé. (V Delphi používáme slova true, false). Příkaz = označuje jak jednoduchý, tak strukturovaný příkaz; např. příkaz cyklu, více příkazů poslouost příkazů, ale i další příkaz větvení. Rozeznáváme dva druhy větvení a to neúplné a úplné. Neúplné větvení Používáme v případě, chceme-li, aby se určitý příkaz vykonal/ provedl jen v případě, že je splněna zadaná podmínka. Zápis obecně jestliže podmínka pak příkaz ; Co se stane? Počítač si v programu přečte podmínku a jestliže je splněna provede příkaz. Jestliže není splněna, program se ukončí. Nestane se nic. Úplné větvení U úplného větvení je to trochu jinak. Používáme jej v případě, že chceme, aby se při splnění podmínky vykonal nějaký příkaz. Když se nesplní vykoná s jiný nebo jiná sada příkazů. Zápis obecně Jestliže podmínka pak příkaz1 jinak příkaz2 Co se stane v tomto případě je popsáno výše. 5 Praxe Příklad 1 Druhá verze v určení pozice želvy pomocí příkazu kdyžjinak. Neprve vykreslíme obdelník a poté, co přesuneme želvu na pozici domu můžeme se začít ptát, zda je v obdelníku či ne. příkaz obdelnik smaž

domů vl 90 do 100 vl 90 do 50 vp 180 opakuj 2 [do 100 90 do 200 90] domů příkaz kd obdelnik // voláme proceduru obdelník, aby se nám na ploše vykreslil kdyžjinak mimo? [-100 50] // ptáme se je-li želva mimo pozici zapsanou v hranaté [text"ano] závorce když není vypíše se Ano. ; jinak se vypíše Ne. [text"ne] Další příklady Příklad 1 Vykreslí sněhovou vločku. Jednu z rekurzivních křivek. Viz. obr. příkaz vločka1 :a do :a vl 60 do :a vp 120 do :a vl 60 do :a příkaz vločka3 vl 90 do 25 vp 90 do 15 opakuj 6 [vlocka1 20 vp 120 vlocka1 20 vl 60] do 100 6 příkaz vločka4 příkaz vločka2 opakuj 6 [vlocka1 10 vp 120 vlocka1 10 vl 60] vl 90 do 50 vp 90 do 25

opakuj 6 [vlocka1 30 vp 120 vlocka1 30 vl 60] do 100 příkaz vločkac smaž domů tp! 2 vlocka2 cekej 500 domů vlocka3 cekej 500 domu vlocka4 Zavoláním vločkyc vznikne obrázek. Příklad 2 Vykreslí trojúhelníkovou spirálu. příkaz troj :d dosad ":d 10 tp! 3 bp! lib do :d vp 119 cekej 100 troj.spir :d + 5 Při jiném nastavení úhlu otáčení vznikají úplně jiné obrazce. Navíc je tato procedura rekurzivní tzn. Vidíte jen část spirály. Příklad 3 Rekurzivní program pro vykreslení nekonečného počtu bodu. příkaz body smaž 7

domů do 1 vp lib tp! 33 bp! lib do 20 body 8