2. Rekurzió. = 2P2(n,n) 2 < 2P2(n,n) 1

Hasonló dokumentumok
Specifikáció. B logikai formula, a bemeneti feltétel, K logikai formula, a kimeneti feltétel, A az algoritmus, amelyre az állítás vonatkozik.

Specifikáció. B logikai formula, a bemeneti feltétel, K logikai formula, a kimeneti feltétel, A az algoritmus, amelyre az állítás vonatkozik.

Rekurzió. Horváth Gyula.

Rekurzió. 1. Feladat: Sorbaállítások száma. 2. Feladat: Zsebpénz. Horváth Gyula Megoldás. Megoldás

A félév során előkerülő témakörök


1. Alapfogalmak Algoritmus Számítási probléma Specifikáció Algoritmusok futási ideje

Fibonacci számok. Dinamikus programozással

Objektum elvű alkalmazások fejlesztése Kifejezés lengyel formára hozása és kiértékelése

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Partíció probléma rekurzíómemorizálással

... fi. ... fk. 6. Fabejáró algoritmusok Rekurzív preorder bejárás (elsőfiú-testvér ábrázolásra)

A szemantikus elemzés helye. A szemantikus elemzés feladatai. A szemantikus elemzés feladatai. Deklarációk és láthatósági szabályok

Objektumok inicializálása

Kiterjesztések sek szemantikája

A függvények névvel rendelkező utasításcsoportok, melyeknek információkat adhatunk át, és van egy visszatérési értékük.

Algoritmusok és adatszerkezetek II.

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós március 3. Széchenyi István Egyetem, Gy r

A C programozási nyelv III. Pointerek és tömbök.

Algoritmusok helyességének bizonyítása. A Floyd-módszer

Bevezetés az algebrába az egész számok

Nagy Gábor compalg.inf.elte.hu/ nagy

A C programozási nyelv III. Pointerek és tömbök.

OOP #14 (referencia-elv)

FUNKCIONÁLIS PROGRAMOZÁS

Programozás BMEKOKAA146. Dr. Bécsi Tamás 2. előadás

Java bevezet o Kab odi L aszl o Kab odi L aszl o Java bevezet o

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

Brósch Zoltán (Debreceni Egyetem Kossuth Lajos Gyakorló Gimnáziuma) Számelmélet I.

Alapok. tisztán funkcionális nyelv, minden függvény (a konstansok is) nincsenek hagyományos változók, az első értékadás után nem módosíthatók

INFORMATIKAI ALAPISMERETEK

Logika es sz am ıt aselm elet I. r esz Logika Harmadik el oad as 1/33

3. Gyakorlat Ismerkedés a Java nyelvvel

Algoritmizálás + kódolás C++ nyelven és Pascalban

Programozási nyelvek Java

Módosítható Prioritási sor Binomiális kupaccal. Wednesday, March 21, 12

A 2016/2017 tanévi Országos Középiskolai Tanulmányi Verseny második fordulójának feladatai. INFORMATIKA II. (programozás) kategória

Programozás II gyakorlat. 4. Öröklődés

Bánsághi Anna 2014 Bánsághi Anna 1 of 68

Kifejezések. Kozsik Tamás. December 11, 2016

17. előadás: Vektorok a térben

A valós számok halmaza

A C# programozási nyelv alapjai

2018, Diszkrét matematika

Kalapácsvetés 2016 szöveges

Diszkrét matematika I.

Programozás I. Első ZH segédlet

GYAKORLATIAS JAVA MINTA

Programozási módszertan. Dinamikus programozás: szerelőszalag ütemezése Mátrixok véges sorozatainak szorzása

Algoritmizálás és adatmodellezés tanítása 1. előadás

Segédanyagok. Formális nyelvek a gyakorlatban. Szintaktikai helyesség. Fordítóprogramok. Formális nyelvek, 1. gyakorlat

Algoritmusok és adatszerkezetek II.

Logika es sz am ıt aselm elet I. r esz Logika 1/36

infix kifejezés a+b ab+ +ab postfix kifejezés prefix kifejezés a+b ab+ +ab a+b ab+ +ab Készítette: Szabóné Nacsa Rozália

Számítástechnika I. BMEKOKAA152 BMEKOKAA119 Infokommunikáció I. BMEKOKAA606. Dr. Bécsi Tamás 2. előadás

A 2016/2017 tanévi Országos Középiskolai Tanulmányi Verseny második forduló javítási-értékelési útmutató. INFORMATIKA II. (programozás) kategória

1. előadás. Lineáris algebra numerikus módszerei. Hibaszámítás Számábrázolás Kerekítés, levágás Klasszikus hibaanalízis Abszolút hiba Relatív hiba

Kupac adatszerkezet. A[i] bal fia A[2i] A[i] jobb fia A[2i + 1]

2. Ítéletkalkulus szintaxisa

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós október 11. Széchenyi István Egyetem, Gy r

Szoftvertechnológia alapjai Java előadások

Informatika terméktervezőknek

Diszkrét matematika 1. estis képzés. Komputeralgebra Tanszék ősz

Logika és informatikai alkalmazásai kiskérdések február Mikor mondjuk, hogy az F formula a G-nek részformulája?

Nagy Gábor compalg.inf.elte.hu/ nagy

List<String> l1 = new ArrayList<String>(); List<Object> l2 = l1; // error

Objektumorientált programozás C# nyelven III.

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

Programozás C- és Matlab nyelven C programozás kurzus BMEKOKAM603 Függvények. Dr. Bécsi Tamás 6. Előadás

Adatszerkezetek és algoritmusok

2016, Diszkrét matematika

Bánsághi Anna 2014 Bánsághi Anna 1 of 33

Nagy Gábor compalg.inf.elte.hu/ nagy ősz

Rekurzió. Dr. Iványi Péter

Megoldás meghatározása Ez a szakasz kitölti a c és S táblázatokat, a kiíratás S alapján egy rekurzív algoritmussal megtehető.

// keressük meg a legnagyobb faktoriális értéket, ami kisebb, // mint százmillió

Java programozási nyelv 4. rész Osztályok II.

ködös határ (félreértés, hiba)

OOP: Java 8.Gy: Abstract osztályok, interfészek

A C programozási nyelv II. Utasítások. A függvény.

Adatszerkezetek és algoritmusok

Programkonstrukciók A programkonstrukciók programfüggvényei Levezetési szabályok. 6. előadás. Programozás-elmélet. Programozás-elmélet 6.

Kongruenciák. Waldhauser Tamás

Programozási alapismeretek :: beadandó feladat. Felhasználói dokumentáció. Molnár Tamás MOTIABT.ELTE

Abstract osztályok és interface-ek. 7-dik gyakorlat

Adatszerkezetek és algoritmusok

Az informatika logikai alapjai

117. AA Megoldó Alfréd AA 117.

1.9. B - SPLINEOK B - SPLINEOK EGZISZTENCIÁJA. numerikus analízis ii. 34. [ a, b] - n legfeljebb n darab gyöke lehet. = r (m 1) n = r m + n 1

Programozás C++ -ban 2007/7

Programozás BMEKOKAA146. Dr. Bécsi Tamás 5. előadás

Diszkrét matematika I.

Programozás II. ATM példa Dr. Iványi Péter

Aritmetikai kifejezések lengyelformára hozása

Alkalmazott modul: Programozás 4. előadás. Procedurális programozás: iteratív és rekurzív alprogramok. Alprogramok. Alprogramok.

Programozási módszertan. Függvények rekurzív megadása "Oszd meg és uralkodj" elv, helyettesítő módszer, rekurziós fa módszer, mester módszer

Java Programozás 9. Gy: Java alapok. Adatkezelő 5.rész

Komplex számok. Wettl Ferenc előadása alapján Wettl Ferenc előadása alapján Komplex számok / 18

3. Határozza meg és írja ki a minta szerint, hogy a forrásállományban hány kémiai elem felfedezési adatai

Átírás:

2. Rekurzió Egy objektum definícióját rekurzívnak nevezünk, ha a definíció tartalmazza a definiálandó objektumot. Egy P eljárást (vagy függvényt) rekurzívnak nevezünk, ha P utasításrészében előfordul magának a P eljárásnak a hívása. 2.1. Partíciószám Definíció. Az n természetes szám egy partíciója olyan π = a 1,,a k sorozat, amelyre: a 1 a 2 a k > 0 k i=1 a i = n (a i a π partíció része.) Jelölje P(n) n összes partíciójának számát. Probléma: Partíciószám Bemenet: n Kimenet: n partícióinak száma, P(n) Megoldás Jelölje P2(n, k) n azon partícióinak számát, amelyben minden rész k. Összefüggések: 1. P2(1,k) = 1, P2(n,1) = 1 2. P2(n,n) = 1 P2(n,n 1) 3. P2(n,k) = P2(n,n) ha n < k 4. P2(n,k) = P2(n,k 1) P2(n k,k) ha k < n A megoldás: P(n) = P2(n,n) public class Particio{ public static long P(int n){ return P2(n,n); private static long P2(int n, int k){ if (k==1 n==1) return 1; if (k>=n) return P2(n,n-1)1; return P2(n, k-1)p2(n-k, k); Rekurziós fa fogalma. Olyan fa, amelynek minden pontja egy eljáráshívást jelent adott aktuális paraméterekre, úgy, hogy a pont fiai megfelelnek azoknak az eljáráshívásoknak, amelyek végrehajtódnak az aktuális paraméterek esetén. Futási idő elemzése Legyen E(n, k) a P2(n, k) eljáráshívás hatására végrehajtott eljárásutasítások száma. Állítás. P2(n,k) E(n,k) 2P2(n,k) 1. P(n) E(n,n) 2P(n,n) 1. Tehát a P(n) eljáráshívás futási ideje Θ(P(n)) Biz. 1. P2(n,k) E(n,k) a. Ha n = 1 vagy k = 1 : P2(n,k) = 1 = E(n,k) b. P2(n,n) = 1 P2(n,n 1) 1 E(n,n 1) = E(n,n) c. n > k: P2(n,k) = P2(n,k 1) P2(n k,k) E(n,k 1) E(n k,k) = E(n,k) 1 < E(n,k) 2. E(n,k) 2P2(n,k) 1. a. Ha n = 1 vagy k = 1 : E(n,k) = 1,P2(n,k) = 1,2 1 1 = 1 b. E(n,n) = 1 E(n,n 1) 1 2P2(n,n 1) 1 = 2[P2(n,n) 1] = 2P2(n,n) 2 < 2P2(n,n) 1 1

5,5 1 5,4 5,3 1,4 1 5,2 2,3 5,1 1 3,2 2,1 1 3,1 1 1,2 1 1. ábra. A P2(5, 5) eljáráshívás rekurziós fája c. n > k: E(n,k) = 1 E(n,k 1) E(n k,k) 1 2P2(n,k 1) 1 2P2(n k,k) 1 = 2[P2(n,k 1) P2(n k,k)] 1 = 2P2(n,k) 1 Állítás. P(n) = Ω(2 n ) Biz. Tekintsük az összes olyan a 1,,a k sorozatot, ahol n a 1 és a 1 > a 2 >... > a k. Ezek száma pontosan 2 n, mivel minden ilyen sorozat egyértelműen megadható b n,...,b 1 bitvektorral, ahol b x = 1 akkor és csak akkor, ha x eleme a sorozatnak. Mivel k n, így k i=1 a i n n n. Minden ilyen sorozathoz adjunk hozzá a végén annyi 1-est, hogy a számok összege n legyen, tehát n egy partícióját kapjuk. Ha két kiindulási sorozat különböző volt, akkor a kiegészítéssel különböző partíciót kapunk. Tehát n partícióinak száma 2 n Következmény. A P algoritmus futási ideje Ω(2 n ). Megjegyzés. 1. Az is bizonyítható, hogy P(n) futási ideje O(2 n ). 2. Nem ismert P(n) kiszámítására zárt formula, de közelítő igen, az u.n. Hardy-Ramanujan formula: P(n) 1 4 e π 3 6n 3n 2.2. Rekurzív algoritmus helyességének bizonyítása I. Terminálás bizonyítása Bebizonyítandó, hogy minden eljáráshívás végrehajtása véges lépésben befejeződik. (Az eljárás terminál.) Terminálás bizonyítása megállási feltétellel. Megállási feltétel Legyen P(x 1,...,x n ) n-paraméteres rekurzív eljárás. A M(x 1,...,x n ) kifejezés megállási feltétele a P rekurzív eljárásnak, ha 1. M(a 1,...,a n ) 0 minden megengedett a 1,...,a n aktuális paraméterre. 2. Ha M(a 1,...,a n ) = 0 akkor nincs rekurzív hívás P(a 1,...,a n ) végrehajtásakor. 3. Ha van rekurzív hívás P(a 1,...,a n ) végrehajtásakor valamely b 1,...,b n paraméterekre, akkor M(b 1,...,b n ) < M(a 1,...,a n ) 2

Állítás: M(n,k) = (n 1) (k 1) megállási feltétel P2-re. II. Helyesség bizonyítása 1. Alaplépés. Annak bizonyítása, hogy az eljárás helyes eredményt számít ki, ha az aktuális paraméterek esetén nincs rekurzív hívás. 2. Rekurzív lépés. Feltéve, hogy minden rekurzív hívás helyes eredményt ad, annak bizonyítása, hogy a rekurzív hívások által adott értékekből az eljárás helyes eredményt számít ki. Általános (szimultán) rekurzió fogalma A {P 1,...,P n eljárásrendszer rekurzív, ha a hívási gráfjában van kör. 2.3. Postfix konverzió Aritmetikai kifejezés szokásos írásmódja, hogy a műveleti jel az argumentumok között áll. Ezt az írásmódot infix jelölésnek is nevezzük. Mivel a multiplikatív műveletek (szorzás és osztás /) prioritása magasabb, mint az additív (, ) műveleteké, ezért zárójelezni kell. Pl. (a b) (c d) a. Lukasiewic lengyel logikatudós vette először észre, hogy ha a műveleti jeleket az argumentumok után írjuk, akkor nincs szükség zárójelekre. Ezért ezt az írásmódot fordított lengyel jelölésnek, vagy postfix alaknak hívjuk. Jelölje φ(k) a K kifejezés postfix alakját. Pl. φ((a b) (c d) a) = ab cd a Probléma: Postfix konverzió Bemenet: K aritmetikai kifejezés infix jelölésben. Kimenet: K postfix alakja. A szabályos aritmetikai kifejezések megadhatók a következő (rekurzív) szintaxis diagramokkal (Az egyszerűség kedvéért az elemi kifejezések csak egybetűs azonosítok lehetnek). Tehát minden kifejezés vagy egy tag, vagy tagok additív műveleti jelekkel elválasztott sorozata. Minden kifejezés egyértelműen Kifejezes * / ( Kifejezes ) a.. z A.. Z 2. ábra. Kifejezés szintaxis diagramjai felbontható K = t 1 1 t 2... m t m1 alakban, ahol i {, és t i tag. Ekkor (a balról-jobbra szabály szerint) φ(k) = φ(t 1 )φ(t 2 ) 1...φ(t m1 ) m. 3

Minden tag vagy egy tényező, vagy tényezők multiplikatív műveleti jellel elválasztott sorozata. Minden tag egyértelműen felbontható T = t 1 1 t 2... m t m1 alakban, ahol i {,/ és t i tényező. Ekkor (a balról-jobbra szabály szerint) φ(t ) = φ(t 1 )φ(t 2 ) 1...φ(t m1 ) m. Minden tényező vagy zárójelbe tett kifejezés; (K) és φ((k)) = φ(k), vagy azonosító; a és φ(a) = a. Tehát a konverzió algoritmusát megalkothatjuk úgy, hogy minden szintaktikus egységhez (Kifejezés,, Tényező, Azonosító) egy eljárást adunk, amely balról jobbra haladva az aktuális karaktertől elolvassa és konvertálja a neki megfelelő (legszűkebb) karaktersorozatot. A megvalósítás algoritmusa nem feltételezi, hogy a bemenet szabályos kifejezés, hibás kifejezés esetén jelzi az első hiba helyét. public class Postfix{ private static boolean Jo=true; private static String S; private static int i=0; private static char Jel; private static String Postform; private static void KovJel(){ Jel=S.charAt(i); i; public static void Kifejezes(){ char M; (); while (Jo && Jel== Jel== - ){ M=Jel; (); Postform=PostformM; private static void (){ char M; (); while (Jo && Jel== * Jel== / ){ M=Jel; (); Postform=PostformM; private static void (){ if ( a <=Jel && Jel<= z ){ Postform=PostformJel; else if (Jel== ( ){ Kifejezes(); if (Jo && Jel== ) ) else Jo=false; else Jo=false; 4

public static String postfix(string K){ S=K. ; Postform=""; Kifejezes(); return Postform; public static void main (String[] args) { System.out.println(postfix("ab*(a-b)/(xy)")); Az eljárásrendszer hívási gráfja. Kifejezes 3. ábra. Az eljárások hívási gráfja 5