Oszd meg és uralkodj�2023.09.27
Ismétlés
Időigény
Időigény
2. gyakorlat
Egy adott (rendezetlen) tömbben elem megtalálása
int linearSearch(int arr[], int n, int x)
{
int i;
for (i = 0; i < n; i++)
if (arr[i] == x)
return i;
return -1;
}
2. gyakorlat
Egy adott (rendezetlen) tömbben elem megtalálása
2. gyakorlat
n elemű rendezett vektorban egy elem megkeresése rekurzívan
int binarySearch(int arr[], int l, int r, int x)
{
if (r >= l) {
int mid = l + (r - l) / 2;
if (arr[mid] == x)
return mid;
if (arr[mid] > x)
return binarySearch(arr, l, mid - 1, x);
return binarySearch(arr, mid + 1, r, x);
}
return -1;
}
2. gyakorlat
n elemű rendezett vektorban egy elem megkeresése?
Oszd meg és uralkodj
Buborékos rendezés
Buborékos rendezés
Oszd meg és uralkodj
Oszd meg és uralkodj
Oszd-meg és uralkodj:
Oszd meg és uralkodj
Felosztás: hogyan osztjuk a feladatot több részfeladatra
Uralkodás: a részfeladatokat rekurzív módon megoldjuk. Ha a részfeladatok mérete elég kicsi, akkor közvetlenül megoldja a részfeladatokat.
Összevonás: a részfeladatok megoldásait összevonjuk az eredeti feladat megoldásává
PL: vállalat adója ->részleg->munkások
Rekurzió
Rekurzió
A rekurzió olyan művelet, mely végrehajtáskor a saját maga által definiált műveletet, vagy műveletsort hajtja végre (általában a probléma egy kisebb példányára), ezáltal önmagát ismétli.
Rekurzió
Csináljunk belőle mindig kisebbet, amíg el nem érjük az alapesetet
Rekurzió
A rekurzív függvényhívás gondolata nagyon hasonló a matematikából ismert teljes indukciós bizonyítási módszerhez:
az állítást belátjuk 1-re, majd n-1 alapján n-re.
Az egyik legegyszerűbb rekurzív definíció a faktoriálisé:
1 faktoriálisa 1, n faktoriálisa n* (n-1)!
Rekurzió
Faktoriális számítás: n! = n· (n - 1) · … · 2 · 1
Rekurzív összefüggés: n! = n · (n - 1)!
Alapeset: n = 1
Rekurzív eset: n > 1: n · (n - 1)!
Rekurzió
A rekurzív függvények természetesen nem a végtelenségig hívják saját magukat, mindig van egy leállási feltétel, azaz a rekurzív függvényeknek szükséges kelléke a feltételes elágazás.
Bináris keresés
Bináris keresés
Bináris keresés
Bináris keresés
Megoldás:
Az oszd meg és uralkodj paradigma 3 lépésének megvalósulása:
1. Feloszt: megnézzük a középső elemet, és az értékétől függően döntünk
2. Uralkodik: Az egyik résztömbben keresünk ugyanezzel a módszerrel
3. Kombinál: Nem szükséges.
Bináris keresés
Írjuk fel a lehetséges eseteket:
1. amikor megtaláljuk az elemet
2. és amikor nincs benne a keresett elem a tömbben
keressünk a megfelelő résztömbben rekurzívan.
Faktoriális
Faktoriális
Írjuk fel a lehetséges eseteket:
Alapeset: 1! = 1
Rekurzív eset: n!=n*(n-1)!
Faktoriális
Írjuk fel a lehetséges eseteket:
Alapeset: 1! = 1
Rekurzív eset: n!=n*(n-1)!
def fakt( n ) :
if ( n == 1 )
return 1
else
return n* fakt(n-1)
Faktoriális
Fibonacci
Fibonacci
Keressük meg a Fibonacci sorozat (1, 1, 2, 3, 5, 8, 13...) N. elemét
Alapeset:
az első és a második elem értéke 1.
Rekurzív eset:
az N. elem az N-1 - edik és az N-2 - dik elemek összege.
Fibonacci
def fibo( n ) :
if (( n == 1 ) || (n == 0)):
return 1
else
return fibo(n-1) + fibo(n-2)
Lépcső probléma
Lépcső
Lépcső
n=4
Lépcső
Lépcső
Lépcső
def P( n ) :
if ( n == 1 )
return 1
elseif ( n == 2 )
return 2
else
return P( n−1) + P( n−2)
Sakk probléma
Sakk
Sakk
n=k=3
Sakk
Sakk
Sakk
Sakk
def R( n , k ):
if ( ( n == 1 ) || ( k == 1 ) ):
return 1
else
return R( n−1, k ) + R( n , k−1)
Hatvány probléma
Hatvány
Hatvány
def hatvany(n,alap):
if ( n == 1 ):
return alap
return alap * hatvany(n-1,alap)
hatvany( 10,2 )
Partició probléma
Partíció
Olyan partíciók érdekelnek bennünket, amelyekben minden elem legfeljebb m.
Jelöljük P(n,m)-mel az n szám olyan partícióinak számát, amelyekben minden szám kisebb vagy egyenlő m-mel.
Például: P(5,2)=3,
a partíciók pedig:
2 + 2 + 1,
2+1+1+1
és 1+1+1+1+1.
Természetes számok partíciója
Egy természetes szám partícióján (felbontásán) természetes számok összegére bontását értjük. Például az 5 a következőképpen bontható fel természetes számok összegére.
5
4+1
3+2
3+1+1
2+2+1
2+1+1+1
1+1+1+1+1
Így az 5-nek összesen 7 különböző partíciója van. Egy partícióban nem számít az elemek sorrendje.
Partíció
P(n,m)-re könnyen találhatunk rekurzív képletet
Felosztjuk a partíciókat két csoportra:
- egyikbe tartoznak azok, amelyekben nincsenek m-mel egyenlő számok (ezek száma P(n,m−1))
- a másikba pedig azok, amelyekben van legalább egy m-el egyenlő
szám (ezek száma P(n−m,m)).
Partíció
Alapesetek:
N=0 ekkor 1 a visszaadott érték
N<0 ekkor 0 a visszaadott érték
M=0 ekkor 0 a visszaadott érték
A rekurzív képlet a következő:
P(n,m) = P(n−m,m) + P(n,m−1) , ahol n > m > 1
Partíció
def count_partitions(n, m):
if n == 0:
return 1
elif n < 0:
return 0
elif m == 0:
return 0
else:
return count_partitions(n-m, m) + count_partitions(n, m-1)
Ajánlott linkek
Ajánlott linkek
Videók
Linkek