Informatikai tehetséggondozás:

Hasonló dokumentumok
Rekurzió 2. Belépő a tudás közösségébe Informatika szakköri segédanyag

Informatikai tehetséggondozás:

Algoritmizálás, adatmodellezés tanítása 11. előadás. (Horváth Gyula előadása alapján)

Rekurzió. (Horváth Gyula és Szlávi Péter előadásai felhasználásával)

Rekurzív algoritmusok

Informatikai tehetséggondozás:

Rekurzió. (Horváth Gyula és Szlávi Péter előadásai. felhasználásával)

Feladatmegoldási stratégiák

Diszkrét matematika 1.

Diszkrét matematika 1.

Kombinatorikai algoritmusok. (Horváth Gyula és Szlávi Péter előadásai felhasználásával)

Kombinatorikai algoritmusok

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

Dinamikus programozás II.

Információk. Ismétlés II. Ismétlés. Ismétlés III. A PROGRAMOZÁS ALAPJAI 2. Készítette: Vénné Meskó Katalin. Algoritmus. Algoritmus ábrázolása

ARCHIMEDES MATEMATIKA VERSENY

Rekurzió. (Horváth Gyula és Szlávi Péter előadásai felhasználásával)

Adatszerkezetek II. 10. előadás

Programozás alapjai. 6. gyakorlat Futásidő, rekurzió, feladatmegoldás

FPI matek szakkör 8. évf. 4. szakkör órai feladatok megoldásokkal. 4. szakkör, október. 20. Az órai feladatok megoldása

Sorozatok I. Brósch Zoltán (Debreceni Egyetem Kossuth Lajos Gyakorló Gimnáziuma)

Nyugat-magyarországi Egyetem Geoinformatikai Kara. Prof. Dr. Závoti József. Matematika III. 1. MA3-1 modul. Kombinatorika

5. Rekurzió és iteráció (Rekurzív programok átírása nemrekurzívvá)

Informatikai tehetséggondozás:

A programozás alapjai 1 Rekurzió

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

Játék a szavakkal. Ismétléses nélküli kombináció: n különböző elem közül választunk ki k darabot úgy, hogy egy elemet csak egyszer

A 2014/2015 tanévi Országos Középiskolai Tanulmányi Verseny döntő forduló javítási-értékelési útmutató. INFORMATIKA II. (programozás) kategória

A 2009/2010 tanévi Országos Középiskolai Tanulmányi Verseny első forduló feladatainak megoldása. INFORMATIKÁBÓL II. (programozás) kategóriában

REKURZIÓ. Rekurzív: önmagát ismétlő valami (tevékenység, adatszerkezet stb.) Rekurzív függvény: függvény, amely meghívja saját magát.

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

Pásztor Attila. Algoritmizálás és programozás tankönyv az emeltszintű érettségihez

Bevezetés a matematikába (2009. ősz) 1. röpdolgozat

2010. október 12. Dr. Vincze Szilvia

Felvételi tematika INFORMATIKA

Oktatási Hivatal. A 2014/2015 tanévi Országos Középiskolai Tanulmányi Verseny döntő fordulójának feladatai. II. (programozás) kategória

Definíció n egymástól megkülönböztethető elem egy sorrendjét az n elem egy (ismétlés nélküli) permutációjának nevezzük.

ARANYMETSZÉS. - érettségi dolgozat védése analízis és algebrából - Készítette: Szénási Eszter Mentor: Dr. Péics Hajnalka június 11.

Analízis előadás és gyakorlat vázlat

Szittyai István december 8. SZTE Bolyai Intézet. Szittyai István (NLG, Hmvh) Partíciók , Bolyai, Szeged 1 / 24

Sorozatok határértéke SOROZAT FOGALMA, MEGADÁSA, ÁBRÁZOLÁSA; KORLÁTOS ÉS MONOTON SOROZATOK

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

Algoritmuselmélet. Legrövidebb utak, Bellmann-Ford, Dijkstra. Katona Gyula Y.

1.1. Alapfeladatok. hogy F 1 = 1, F 2 = 1 és általában F n+2 = F n+1 + F n (mert a jobboldali ág egy szinttel lennebb van, mint a baloldali).

Informatikai tehetséggondozás:

S Z A K D O L GO Z AT

10. Egy családfában csak a férfiakat és fiúgyerekeket ábrázoljuk, egy közös ősből kiindulva. Készíts

INFORMATIKA javítókulcs 2016

2009. májusi matematika érettségi közép szint

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

8. Előadás. Megyesi László: Lineáris algebra, , oldal. 8. előadás Mátrix rangja, Homogén lineáris egyenletrendszer

Rekurzió. Dr. Iványi Péter

Visszalépéses maximumkiválasztás

SCILAB programcsomag segítségével

Összetett programozási tételek

Bevezetés az informatikába

Informatikai tehetséggondozás:

Funkcionálanalízis. n=1. n=1. x n y n. n=1

A tényleges mérőszám függ az adat méretétől, illetve a feltétel összetettségétől.

Programozási nyelvek 3. előadás

Ismétlés nélküli kombináció

2015, Diszkrét matematika

Visszalépéses kiválogatás

Biomatematika 2 Orvosi biometria

A 2015/2016. tanévi Országos Középiskolai Tanulmányi Verseny döntő forduló MATEMATIKA III. KATEGÓRIA (a speciális tanterv szerint haladó gimnazisták)

Matematika szóbeli érettségi témakörök 2016/2017-es tanév őszi vizsgaidőszak

24. tétel. Kombinatorika. A grá fok.

BABEŞ-BOLYAI TUDOMÁNYEGYETEM MATEMATIKA-INFORMATIKA KAR Felvételi verseny - minta Informatika írásbeli

Kombinatorika jegyzet és feladatgyűjtemény

Programozás alapjai II. (7. ea) C++ Speciális adatszerkezetek. Tömbök. Kiegészítő anyag: speciális adatszerkezetek

Multihalmaz, intervallumhalmaz

Tanmenet a évf. fakultációs csoport MATEMATIKA tantárgyának tanításához

Osztályozóvizsga és javítóvizsga témakörei Matematika 9. évfolyam

Informatikai tehetséggondozás:

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

Arany Dániel Matematikai Tanulóverseny 2014/2015-ös tanév első (iskolai) forduló Haladók II. kategória

KOVÁCS BÉLA, MATEMATIKA I.

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

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

Számelmélet Megoldások

26. MINIMÁLIS KÖLTSÉGŰ UTAK MINDEN CSÚCSPÁRRA

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

Előfeltétel: legalább elégséges jegy Diszkrét matematika II. (GEMAK122B) tárgyból

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

} számtani sorozat első tagja és differenciája is 4. Adja meg a sorozat 26. tagját! A = { } 1 pont. B = { } 1 pont. x =

Érettségi feladatok: Trigonometria 1 /6

Gyakorló feladatok 9.évf. halmaznak, írd fel az öt elemű részhalmazokat!. Add meg a következő halmazokat és ábrázold Venn-diagrammal:

0-49 pont: elégtelen, pont: elégséges, pont: közepes, pont: jó, pont: jeles

Adatszerkezetek I. 7. előadás. (Horváth Gyula anyagai felhasználásával)

Gazdasági matematika II. vizsgadolgozat megoldása, június 10

Hatékonyság 1. előadás

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

Matematika érettségi emelt 2008 október. x 2 0. nem megoldás. 9 x

Matematikai játékok és az aranymetszés

rank(a) == rank([a b])

2015, Diszkrét matematika

2018, Diszkrét matematika

Komplex számok. Wettl Ferenc szeptember 14. Wettl Ferenc Komplex számok szeptember / 23

[Biomatematika 2] Orvosi biometria

A 2010/2011 tanévi Országos Középiskolai Tanulmányi Verseny döntő fordulójának megoldása. II. (programozás) kategória

Átírás:

Ég és Föld vonzásában a természet titkai Informatikai tehetséggondozás: Rekurzió memorizálással TÁMOP-.2.3.-12/1/KONV

Bajok a rekurzióval Hely: nagyra dagadt memóriaméret az ismétlődő eljáráshívások miatt. Idő: a többszörösen ismétlődő hívások felesleges kiszámolása. Pl. Fibonacci-számoknál: F(n) F(n-1) F(n-2) F(n-2) F(n-3) F(n-3) F(n-) F(n-3) F(n-) F(n-) F(n-5) F(n-) F(n-5) F(n-5) F(n-6) Az ábráról látható: F(N) kiszámolásai száma: 1 F(N-1) kiszámolásai száma: 1 F(N-2) kiszámolásai száma: 2 F(N-3) kiszámolásai száma: 3 F(N-) kiszámolásai száma: 5 ebből következően F(N-5) kiszámolásai száma: Ezek a kiszámolási számok éppen a Fibonacci számok. Egy kis matematika: Legyen r(n):=az N. Fibonacci-szám kiszámításához szükséges függvényhívások száma! r(0):=1, r(1):=1, r(i):=r(i-1)+r(i-2)+1 Állítás: a) r(i)=f(i+1)+f(i)+f(i-1)-1, ha i>1 b) r(i)=2*f(i+1)-1, ahol F(i)=az i. Fibonacci-szám. Megoldási ötlet: amit már kiszámoltunk egyszer, azt ne számoljuk újra! Tároljuk a már kiszámolt értékeket memorizáljuk, s ha szükségünk van rájuk, használjuk fel őket! 2

1. A Fibonacci-számok A rekurzív függvények matematikai elméletében éppúgy ismert, mint a biológiában a Fibonacci olasz matematikusról elnevezett számsorozat. Azt vizsgálta, hogy egy nyúlpár alapította nyúlnemzetség adott idő alatt mekkora létszámúra növekszik, figyelembe véve, hogy a leszármazottak is alaposan besegítenek a létszámnövelésbe. Ha a szaporodás eléggé szabályosan történik, akkor az új generáció létszámát az előzőek ismeretében könnyen kiszámíthatjuk. Szerinte az új generáció növekedését az előző 2 generáció gyerekei teszik ki. E mögött az a feltételezés húzódik meg, hogy minden nyúlpár egyszerre éppen 2 utóddal járul a népességhez, és e szokásukat születésüket követő 2 egymásutáni időpontban gyakorolják (mert mondjuk mielőtt a harmadik szaporodásra sor kerülhetne, fazékba kerülnek). Definíciója: Fib n 0 ha n 0 1 ha n 1 Fib n 1 Fib n 2 ha n 1 Példa: (a Fibonacci-szám sorozat első néhány tagja) 0,1,1,2,3,5,,13,21,3,55,... Fib(N): Elágazás N=0 esetén Fib:=0 N=1 esetén Fib:=1 egyéb esetben Fib:=Fib(N-1)+Fib(N-2) A memorizálásos megoldásban F(i) 0 jelenti, ha már kiszámoltuk az i-edik Fibonacci számot. A függvény hívása előtt az F vektor elemei értékét -1-re kell állítani! Fib(N): Ha F(N)<0 akkor Elágazás N=0 esetén F(N):=0 N=1 esetén F(N):=1 egyéb esetben F(N):=Fib(N-1)+Fib(N-2) Fib:=F(N) 3

Járdakövezés Számítsuk ki, hogy hányféleképpen lehet egy n egység méretű járdát kikövezni 1x1, 1x2 és 1x3 méretű lapokkal! Az első helyre tehetünk 1x1-es lapot: Az első helyre tehetünk 1x2-es lapot: Az első helyre tehetünk 1x3-as lapot: Az első esetben n-1, a másodikban n-2-t, a harmadikban pedig n-3 cellát kell még lefednünk. Azaz az n cella lefedéseinek Lefed(n) száma Lefed(n-1)+Lefed(n-2)+Lefed(n-3). Lefed(N): Elágazás N=0 esetén Lefed:=0 N=1 esetén Lefed:=1 N=2 esetén Lefed:=2 egyéb esetben Lefed:=Lefed(N-1)+Lefed(N-2)+Lefed(N-3) Itt már három rekurzív hívás van korábbi N értékekre, még nagyobb lehet az átfedés a kiszámolásokban. L(i)=-1 jelenti, hogy L(i)-t még nem számoltuk ki, L(i) 0 jelenti, hogy már kiszámoltuk. Lefed(N): Ha L(N)<0 akkor Elágazás N=0 esetén L(N):=0 N=1 esetén L(N):=1 N=2 esetén L(N):=2 egyéb esetben L(N):=Lefed(N-1)+Lefed(N-2)+Lefed(N-3) Lefed:=L(N)

2. Binomiális együtthatók Egy véges halmaz, melynek N darabszámú elemeiből K elemszámú halmazokat (kombinatorika nevén osztályokat) akarunk mindenféle módon képezni (és minden elem csak egyszer fordul elő). Ezt úgy hívjuk, hogy n elem k-ad osztályú ismétlés nélküli kombinációja. Ezen kombinációk száma megegyezik a matematikából máshonnan is ismert binomiális együtthatókkal. A binomiális együtthatókat a következő képlettel definiálhatjuk: n k n! k! n k! Ennek kiszámítása hosszú programot igényelne, próbálkozzunk inkább egy másik kiszámítási módszerrel! Ehhez nézzük meg e számok elrendezését, a Pascal háromszöget: 1 1 1 1 2 1 1 3 3 1 1 6 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 2 56 70 56 2 1 1 36 126 126 36 1 1 10 5 120 210 252 210 120 5 10 1 1 55 165 330 62 62 330 165 55 1 1 12 66 220 5 72 2 72 5 220 66 12 1 Felfedezhetjük, hogy a fenti táblázatban minden szám a fölötte levő két szám összege, azaz N elemből K elem választása leírható az alábbi módon: az első elemet választjuk, majd még N-1 elemből választunk K-1 elemet. vagy az első elemet nem választjuk és a maradék N-1 elemből választunk K elemet. Bin(n,k): Ha k=0 vagy k=n akkor Bin:=1 különben Bin:=Bin(n-1,k)+Bin(n-1,k-1) Eljárás vége. 5

Adott n és k értékre az alábbi téglalapbeli elemeket számoljuk ki, de mindegyiket annyiszor, ahányféleképpen az (n.k) elemből felfelé haladva eljuthatunk hozzájuk. 1 1 1 1 2 1 1 3 3 1 1 6 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 2 56 70 56 2 1 1 36 126 126 36 1 1 10 5 120 210 252 210 120 5 10 1 1 55 165 330 62 62 330 165 55 1 1 12 66 220 5 72 2 72 5 220 66 12 1 Itt is memorizálunk, B(n,k)=-1 jelentse azt, hogy (n,k)-ra még nem számoltuk ki a Bin függvény értékét, B(n,k) 0 pedig azt, hogy már kiszámoltuk: Bin(n,k): Ha B(n,k)<0 akkor Ha k=0 vagy k=n akkor B(n,k):=1 különben B(n,k):=Bin(n-1,k)+Bin(n-1,k-1) Bin:=B(n,k) Eljárás vége. 3. Ősök N ember mindegyikéről tudjuk, hogy ki az anyja (a két szülőből így csak az egyiket kell tárolni), az embereket sorszámukkal azonosítjuk. Mindenkinek egyértelműen 1 anyja lehet, emiatt az adatokat egyetlen vektorban tárolhatjuk: Anya(i) jelenti az i. ember anyjának sorszámát. Akinek nem ismerjük az anyját, annál ez a sorszám legyen 0! A kapcsolatokból egy ilyen hálózat épülhet fel: 12 10 7 1 2 3 5 6 6

Adjuk meg egy adott ember (A) legrégebbi ősét! Az ős saját maga, ha az anyját nem ismerjük. Ha az anyját ismerjük, akkor a legrégebbi őse megegyezik az anyja legrégebbi ősével megtaláltuk a rekurziót: Ős(A): Ha Anya(A)=0 akkor Ős:=A különben Ős:=Ős(Anya(A)) Ez a rekurzív függvény csak egyszer hívja magát, azaz többször ugyanazzal a paraméterrel biztos nem hívja meg magát, nincs értelme memorizálással foglalkozni. Módosítsuk a feladatot: adjuk meg két adott ember (A és B) legrégebbi közös ősét, ha van! Közös ős(a,b): x:=őse(a) y:=őse(b) Ha x=y akkor Közös ős:=x különben Közös ős:=0 Itt már felmerülhet a többszöri kiszámítás. Ha az előző oldali példa szerint 1 és 2 közös ősét keressük, akkor az első Őse függvényhívás megadja a 12 sorszámú embert, a második függvényhívás pedig ebben a hálóban újra felmegy a 12-ig. A hálón azonban az látható, hogy ha másodszor a 7-ig elértünk, akkor már tudjuk, hogy a legrégebbi 12 a közös ős. 12 10 7 1 2 3 5 6 Tehát memorizáljuk A őseit! Ős(A): Volt(A):=igaz Ha Anya(A)=0 akkor Ős:=A különben Ős:=Ős(Anya(A)) 7

Van közös(b): Ha Volt(B) akkor Van közös:=igaz különben Ha Anya(B)=0 akkor Van közös:=hamis különben Van közös:=van közös(anya(b)) Közös ős(a,b): x:=őse(a) Ha Van közös(b) akkor Közös ős:=x különben Közös ős:=0. Ősök száma Számoljuk ki az előző példát folytatva egy adott ember (A) ősei számát! Ha nem ismerjük az anyját, akkor ez a szám 0, ha ismerjük, akkor neki az anyja ősei számánál eggyel több őse van: Ősszám(A): Ha Anya(A)=0 akkor Ősszám:=0 különben Ősszám:=Ősszám(Anya(A))+1 Itt is egyetlen rekurzív hívás van, azaz memorizálásra nincs szükség. Módosítsuk a feladatot, számoljuk ki két ember (A,B) közös ősei számát! A közös ősök halmaza az A és a B ősei halmazának közös része (metszete) lesz. Az alapmegoldásunk ennek meghatározására nem alkalmas két ember ősei számából ez a szám nem határozható meg. Itt tehát mindenképpen nem csak hatékonysági szempontból szükségünk van memorizálásra. 12:0 10:1 7:2 1: 3 2 3 5 6

is! A megoldásban az ősök számának meghatározása közben számoljuk ki az ősök ősei számát Ősszám(A): Ha Anya(A)=0 akkor Db(A):=0 különben Db(A):=Ősszám(Anya(A))+1 Ősszám:=Db(A) Ebben az esetben a B-vel közös ősök számát pontosan akkor tudjuk meg, amikor B-ből elérjük az első közös őst! KözösŐsszám(B): Ha Db(B) 0 akkor KözösŐsszám:=Db(B)+1 különben Ha Anya(B)=0 akkor KözösŐsszám:=0 különben KözösŐsszám:= KözösŐsszám(Anya(B)) Közös Ősök száma(a,b): x:=ősszám(a) Közös Ősök száma:=közösősszám(b) 5. Ősök távolsága A következő feladatban azt szeretnénk tudni, hogy egy adott ember milyen távolságra van a legrégebbi ősétől. Nem meglepően ez ugyanaz a feladat, mint az ősök száma: Távolság(A): Ha Anya(A)=0 akkor Távolság:=0 különben Távolság:=Távolság(Anya(A))+1 Ha azonban arra lennénk kíváncsiak, hogy két ember legközelebbi közös őse milyen távol van tőlük (azaz a két távolság összege érdekel), akkor ez az információ (és ezzel együtt ez a megoldás) nem elégséges. Memorizálnunk kell, de nem az ősök számát, hanem az adott embertől vett távolságot : Távolság(A,i): TAV(A):=i Ha Anya(A)=0 akkor Távolság:=0 különben Távolság:=Távolság(Anya(A),i+1)+1

12:3 10:2 7:1 1:0 2 3 5 6 Ekkor a közös ős távolság két távolság összegeként számolandó: KözösTávolság(B,i): Ha TAV(B) 0 akkor KözösTávolság:=TAV(B)+i különben Ha Anya(B)=0 akkor KözösTávolság:=-1 különben KözösTávolság:=KözösTávolság(Anya(B),i+1) 6. Legtöbb ember őse Ez az a feladat, ami csak memorizálással oldható meg azt kell tárolni mindenkiről, hogy hány embernek őse. Praktikus lenne az emberek olyan sorszámozását megadni, ahol tudjuk, hogy kik azok, akik a hálóban alul vannak, mert belőlük érdemes elindulni felfelé. 12 10 7 1 2 3 5 6 Itt az 1..7, általánosan fogalmazva az 1..K sorszámú emberekből kell kiindulni. 10

Utódszám(A,x): Ha Anya(A)=0 akkor Db(A):=Db(A)+x különben Db(A):=Db(A)+x; Utódszám(Anya(A),x+1) Eljárás vége. Legtöbb utód(max): Ciklus i=1-től K-ig Utódszám(i,0) Ciklus vége max:=1 Ciklus i=2-től N-ig Ha Db(i)>Db(max) akkor max:=i Ciklus vége Eljárás vége.