Lokální definice (1) plocha-kruhu



Podobné dokumenty
Hledání kořenů rovnic jedné reálné proměnné metoda půlení intervalů Michal Čihák 23. října 2012

Programovací jazyk Pascal

metoda Regula Falsi 23. října 2012

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

Algoritmizace prostorových úloh

Tematický celek Proměnné. Proměnné slouží k dočasnému uchovávání hodnot během provádění aplikace Deklarace proměnných

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

Algoritmizace prostorových úloh

Hledání kořenů rovnic jedné reálné proměnné metoda sečen Michal Čihák 23. října 2012

Paradigmata programování 1

KAPITOLA 9 - POKROČILÁ PRÁCE S TABULKOVÝM PROCESOREM

METODA PŮLENÍ INTERVALU (METODA BISEKCE) METODA PROSTÉ ITERACE NEWTONOVA METODA

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

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

Programovací jazyk. - norma PASCAL (1974) - implementace Turbo Pascal, Borland Pascal FreePascal Object Pascal (Delphi)

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

IB015 Neimperativní programování. Seznamy, Typy a Rekurze. Jiří Barnat Libor Škarvada

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

ALGORITMIZACE A PROGRAMOVÁNÍ

PARADIGMATA PROGRAMOVÁNÍ 2 PŘÍSLIBY A LÍNÉ VYHODNOCOVÁNÍ

Software602 Form Designer

Kontingenční tabulky v MS Excel 2010

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

NPRG030 Programování I, 2017/18 1 / :22:16

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

Algoritmizace prostorových úloh

Algebraické rovnice. Obsah. Aplikovaná matematika I. Ohraničenost kořenů a jejich. Aproximace kořenů metodou půlení intervalu.

Dynamicky vázané metody. Pozdní vazba, virtuální metody

EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI

Excel tabulkový procesor

PODPROGRAMY PROCEDURY A FUNKCE

Přednáška 3: Limita a spojitost

Preprocesor a koncepce (větších) programů. Úvod do programování 2 Tomáš Kühr

Algoritmizace prostorových úloh

Základy algoritmizace a programování

7. Datové typy v Javě

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

Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost rozhraním a výjimkám.

2. Numerické výpočty. 1. Numerická derivace funkce

Jednoduché cykly

4.3. GONIOMETRICKÉ ROVNICE A NEROVNICE

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

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

Numerická matematika 1

Sada 1 - Základy programování

Assembler - 5.část. poslední změna této stránky: Zpět

Příklad 1. Řešení 1a Máme vyšetřit lichost či sudost funkce ŘEŠENÉ PŘÍKLADY Z M1A ČÁST 3

Datové struktury 2: Rozptylovací tabulky

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

Programovani v Maplu Procedura

Funkce. Limita a spojitost

Lineární funkce, rovnice a nerovnice 4 lineární nerovnice

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í

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku

Numerické řešení rovnice f(x) = 0

Rozšíření ksh vůči sh při práci s proměnnými

6 Příkazy řízení toku

Sada 1 - PHP. 03. Proměnné, konstanty

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

Paradigmata programování 1

Hanojská věž. T2: prohledávání stavového prostoru. zadání [1 1 1] řešení [3 3 3] dva možné první tahy: [1 1 2] [1 1 3]

Nalezněte obecné řešení diferenciální rovnice (pomocí separace proměnných) a řešení Cauchyho úlohy: =, 0 = 1 = 1. ln = +,

Základy matematiky pro FEK

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

Časová a prostorová složitost algoritmů

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

Nejčastějšími funkcemi, s kterými se setkáváme v matematice i v jejích aplikacích, jsou

Tvorba výrazu: speciální znaky shellu se uvádějí do apostrofů jednotlivé části výrazu se oddělují mezerou

DRN: Kořeny funkce numericky

Limita a spojitost funkce

5 Přehled operátorů, příkazy, přetypování

PHP - úvod. Kapitola seznamuje se základy jazyka PHP a jeho začleněním do HTML stránky.

Funkcionální programování. Kristýna Kaslová

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Logické programování I

Domény. Petr Štěpánek. S využitím materialu Krysztofa R. Apta

VY_32_INOVACE_08_2_04_PR

LEKCE10-RAD Otázky

COMPLEXITY

Přednáška 11, 12. prosince Část 5: derivace funkce

Definice globální minimum (absolutní minimum) v bodě A D f, jestliže X D f

Základy matematické analýzy

1. Dědičnost a polymorfismus

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

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Operátory, výrazy. Tomáš Pitner, upravil Marek Šabo

Pole a Funkce. Úvod do programování 1 Tomáš Kühr

Přednáška 8. Proměnné. Psaní a ladění skriptů. Parametry skriptu. Vstup a výstup. Konfigurační soubory shellu. Úvod do Operačních Systémů Přednáška 8

Algoritmizace a programování

Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem

Algoritmizace prostorových úloh

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Koncepce (větších) programů. Základy programování 2 Tomáš Kühr

Úvod do databázových systémů

Polymorfismus. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 30.března

8 Třídy, objekty, metody, předávání argumentů metod

Náplň. v Jednoduché příklady na práci s poli v C - Vlastnosti třídění - Způsoby (algoritmy) třídění

Rekurzivní algoritmy

Transkript:

Lokální definice (1) syntaxe: (local (seznam definic) výraz) definice jsou dostupné pouze uvnitř příkazu local příklad: (local ( (define Pi 3.1415926) (define (plocha-kruhu r) (* Pi r r)) ) (plocha-kruhu 10) ) Pi běhová chyba, neznámé Pi

Lokální definice (2) libovolná definice může být lokální konstanty, funkce, datové struktury,... pro rozsahy platnosti platí obvyklá pravidla lokální definice zastiňuje definici přicházející zvenčí (define x 10) (local ( (define x 20) ) x ) x

Použití lokálních definic obvyklé využití: local je tělem funkce, zavádí lokální hodnoty nebo pomocné funkce příklad: (define (plocha-kruhu r) (local ( (define Pi 3.1415926) ) (* Pi r r))) tento příklad je hloupý proč?

Lokální pomocná funkce spojit dva seznamy, vybírat vždy číslo s menší abs. hodnotou (define (absmin-seznam L1 L2) (local ( (define (absmin X Y) (min (abs X) (abs Y)) ) (cond [(or (empty? L1) (empty? L2)) '()] [else (cons (absmin (car L1) (car L2)) (absmin-seznam (cdr L1) (cdr L2)))] )))

Problém podpůrné funkce předchozí příklad funguje, ale definuje pomocnou funkci opakovaně každé rekurzivní volání znamená novou definici absmin (její obsah se ale nijak nemění) trik předefinovat sama sebe, použít local pro: definice všech podpůrných funkcí redefinice sama sebe (skutečné tělo) tělem bude volání sama sebe (volá se předefinovaná verze)

Pomocná funkce znovu a lépe (define (absmin-seznam L1 L2) (local ( (define (absmin X Y) pomocná funkce (min (abs X) (abs Y)) ) (define (absmin-seznam L1 L2) redefinice (cond [(or (empty? L1) (empty? L2) '()] [else (cons (absmin (car L1) (car L2)) (absmin-seznam (cdr L1) (cdr L2)))] )) ) (absmin-seznam L1 L2)))

Zvyšování efektivity (1) průměr z pozitivních čísel, první pokus (define (vyber-kladne L) (cond [(empty? L) '()] [(>= 0 (car L)) (vyber-kladne (cdr L))] [else (cons (car L) (vyber-kladne (cdr L)))] )) (define (secti L) (cond [(empty? L) 0] [else (+ (car L) (secti (cdr L)))] ))

Zvyšování efektivity (2) (define (prumer-kladnych L) (cond [(empty? (vyber-kladne L)) #f] [else (/ (secti (vyber-kladne L)) (length (vyber-kladne L)))] )) v čem je problém? vyber-kladne se volá třikrát rekurzivní funkce každé volání dá spoustu práce

Zlepšování efektivity (3) s výhodou lze využít lokální definici uložíme výsledek vyber-kladne a používáme (define (prumer-kladnych L) (local ( (define kladne (vyber-kladne L)) ) (cond [(empty? kladne) #f] [else (/ (secti kladne) (length kladne))] ) ))

Krok stranou ještě lepší řešení zavést obecnou funkci pro průměr seznamu (lze pak využít i jinde): (define (prumer L) (cond [(empty? L) #f] [else (/ (secti L) (length L))] )) (define (prumer-kladnych L) (prumer (vyber-kladne L)))

Lokální definice shrnutí skrývá lokální konstrukce vyhýbá se opakovaným výpočtům a definicím (redefinice sama sebe) poskytuje přirozený mechanismus pro ukládání (průběžných) výsledků zvyšuje čitelnost kódu díky vhodně zvoleným identifikátorům stojí za zamyšlení, zda nenahradit voláním funkce s odpovídajícím parametrem

Rozsah platnosti identifikátorů oblast: část programu, kde identifikátor existuje globální identifikátory: celý program identifikátory definované v local: uvnitř local parametry funkcí: tělo funkce rozsah platnosti: část programu, v níž výskyt daného identifikátoru znamená danou konkrétní definici oblast bez vnořených oblastí stejnojmenných identifikátorů lokální definice zastiňuje definici přicházející zvenčí

Příklad (define x 20)... (local ( (define x 10) (define (mocnina4 x) (* x x x x) ) ) (mocnina x) ) x

Funkcionální abstrakce opakování je častým zdrojem chyb je lépe se vyhnout vytváření podobných funkcí příklad: vyhledávání (define (hledejcislo? N L) (cond [(empty? L) #f] [(= N (car L)) #t] [else (hledejcislo? N (cdr L))] )) různé typy hledání se liší jen zde např string=? pro řetězce

Funkcionální parametry funkce může být parametrem jiné funkce zachází se s ní zcela normálně, jen se ve výrazech používá na prvním místě jako název funkce příklad: funkce, které předáme funkci dvou argumentů a dvě hodnoty, vydá výsledek dané funkce pro tyto hodnoty (define (zavolej funkce x y) (funkce x y)) (zavolej + 10 36)... 46

Obecné hledání předejme kritérium jako argument (define (hledej? kriterium? N L) (cond [(empty? L) #f] [(kriterium? N (car L)) #t] [else (hledej? kriterium? N (cdr L))] )) použití: (hledej? = 10 SeznamCisel) (hledej? string=? Jan Veselý SeznamJmen)

Použití obecného hledání volání je složitější může se hodit si navíc definovat specializované funkce (pro čísla, řetězce,...), ale jako konkretizace obecné funkce: (define (hledejcislo? N L) (hledej? = N L)) sdílejí společný vyhledávací mechanismus -> mají konzistentní chování lze předat i uživatelem definovanou funkci (např. porovnávající dvě datové struktury)

Hledání kořene f(x)=0 metoda půlení intervalů parametry spojitá funkce 1 proměnné f(x) čísla a (levý okraj intervalu) a b (pravý) taková, že f(a) a f(b) mají opačná znaménka rozpůlíme interval a pokračujeme polovinou, kde jsou v krajních bodech opačná znaménka a m b f(a) příští krok f(m) f(b)

Hledání kořene kód (define PRESNOST 0.001) (define (hledej-koren f levy pravy) (local ((define stred (/ (+ levy pravy) 2))) (cond [(> PRESNOST (abs (f stred))) stred] [(> 0 (* (f levy) (f stred))) (hledej-koren f levy stred)] [else (hledej-koren f stred pravy)] )))

Filtrování seznamu obvyklá úloha: vybrat ze seznamu prvky vyhovující určité podmínce (define (filtr podminka? L) (cond [(empty? L) '()] [(podminka? (car L)) (cons (car L) (filtr podminka? (cdr L)))] [else (filtr podminka? (cdr L))] )) použití: vybrat pozitivní hodnoty (filtr positive? SeznamCisel)

Výhody abstrakce flexibilita abstraktní funkce lze použít k řešení řady podobných úloh program je kratší a snadněji pochopitelný konzistence ve všech případech se chovají konzistentně (minimalizováno riziko překlepů) změny/vylepšení se promítnou do chování všech abstrakce je lepší než kopírování + změny

Generické/polymorfní funkce naše filtrovací funkce zpracuje seznam libovolného typu (i směs typů) vše závisí na podmínce výsledkem je seznam stejného typu (získaný výběrem těch hodnot, které vyhověly podmínce) funkce, které jednotně zpracovávají různé datové typy, jsou označovány jako generické nebo polymorfní

Rozšířené popisy komentář popisující typy argumentů a výsledku funkce potřebuje rozšíření typy hodnot v seznamu: ; hledejcislo?: číslo (listof číslo) -> boolean funkcionální argumenty: ; hledej?: (X Y -> boolean) X (listof Y) -> boolean zároveň obsahuje polymorfismus konkrétní typy zastupují písmena, stejné písmeno znamená nutnost stejného typu

Zkoumání možností (1) někdy lze generickou funkci použít i v nečekaných situacích příklad: zpracováváme seznam s cílem získat určitou hodnotu (např. sečíst prvky seznamu) pro prázdný seznam použijeme nějakou základní hodnotu jinak zkombinujeme první prvek seznamu s výsledkem rekurzivního volání sama sebe na zbytek seznamu

Zkoumání možností (2) (define (fold zaklad kombinuj L) (cond [(empty? L) zaklad] [else (kombinuj (car L) (fold zaklad kombinuj (cdr L)))] )) (define (soucet L) (fold 0 + L)) (define (soucin L) (fold 1 * L)) (define (??? L1 L2) (fold L2 cons L1))

Zkoumání možností (3) ; vložení čísla do vzestupně uspořádaného seznamu (define (insert N L) (cond [(empty? L) (list N)] [(<= N (car L)) (cons N L)] [else (cons (car L) (insert N (cdr L)))] )) (define (insertsort L) (fold '() insert L)) generickou funkci lze mnohdy využít i v netušených případech

vytvořeno s podporou projektu ESF