You are on page 1of 107

Rekurencja

Wykład 3
Wiele ważnych algorytmów ma strukturę
rekurencyjną,
którą można opisać następująco:

W celu rozwiązania danego problemu


algorytm wywołuje sam siebie
w sposób bezpośredni lub pośredni.

Marek Łatko 2005 2


Definicja procedury rekurencyjnej:

Jest to taka procedura napisana w określonym


języku programowania, która zawiera
wywołanie samej siebie

Marek Łatko 2005 3


Metoda „dziel i zwyciężaj”

Strategia polegająca na:


1. podzieleniu problemu głównego na
podproblemy ( najczęściej dwa)

Marek Łatko 2005 4


Metoda „dziel i zwyciężaj”

Strategia polegająca na:


1. podzieleniu problemu głównego na
podproblemy ( najczęściej dwa)
2. znalezieniu rozwiązań podproblemów

Marek Łatko 2005 5


Metoda „dziel i zwyciężaj”

Strategia polegająca na:


1. podzieleniu problemu głównego na
podproblemy ( najczęściej dwa)
2. znalezieniu rozwiązań podproblemów
3. na ich podstawie znalezieniu rozwiązania
problemu głównego

Marek Łatko 2005 6


Trzy etapy metody „dziel i zwyciężaj”

1) DZIEL : dzielimy problem na podproblemy

Marek Łatko 2005 7


Trzy etapy metody „dziel i zwyciężaj”

1) DZIEL : dzielimy problem na podproblemy

2) ZWYCIĘŻAJ : rozwiązujemy podproblemy


rekurencyjnie

Marek Łatko 2005 8


Trzy etapy metody „dziel i zwyciężaj”

1) DZIEL : dzielimy problem na podproblemy

2) ZWYCIĘŻAJ : rozwiązujemy podproblemy


rekurencyjnie

3) POŁĄCZ : łączymy rozwiązania


podproblemów, aby otrzymać
rozwiązanie wyjściowego
problemu.
Marek Łatko 2005 9
Przykład 1

Problem:
Dana jest tablica n liczb całkowitych :
a[1], ..., a[n].

Czy w tej tablicy występuje element x ?

Marek Łatko 2005 10


Rozwiązanie:
Dziel:
Podzielimy tablice na dwie części:
CZĘŚĆ I: pierwszy element tablicy, tzn. a[1]
CZĘŚĆ II: pozostałe (n-1) elementów, tzn.
a[2], ..., a[n]

Marek Łatko 2005 11


Rozwiązanie:
Dziel:
Podzielimy tablice na dwie części:
CZĘŚĆ I: pierwszy element tablicy, tzn. a[1]
CZĘŚĆ II: pozostałe (n-1) elementów, tzn.
a[2], ..., a[n]
Zwyciężaj:
Jeżeli pierwszy element jest równy x, to wynikiem
jest napis „TAK WYSTĘPUJE” i KONIEC
w przeciwnym razie
sprawdzamy, czy x występuje w pozostałych n-1
elementach (czyli w części II)
Marek Łatko 2005 12
UWAGA:
Podane zostały warunki tylko
pozytywnego zakończenia problemu. W
przypadku, gdy przebadaliśmy całą tablicę
i element x nie został znaleziony, to
działanie algorytmu powinno się zakończyć
wraz z podaniem napisu :
„NIE ZNALEZIONO”.

Marek Łatko 2005 13


SZUKAJ ([a1, ..., an], lewy, prawy, x)
{lewy- oznacza lewą,
prawy- oznacza prawą granicę przeszukiwanego
obszaru tablicy;
na początku lewy=1, prawy=n}
początek
jeżeli lewy > prawy to „BRAK W CIĄGU”
w przeciwnym razie
jeżeli a[lewy]=x to „JEST W CIĄGU”
przeciwnym razie
SZUKAJ([a1, ..., an], lewy+1, prawy, x)
koniec

Marek Łatko 2005 14


Warunkiem zakończenia algorytmu jest:
albo
znalezienie szukanego elementu :
a[lewy] = x
albo

Marek Łatko 2005 15


Warunkiem zakończenia algorytmu jest:
albo
znalezienie szukanego elementu :
a[lewy] = x
albo
wyjście poza poszukiwany obszar :
lewy > prawy .

Marek Łatko 2005 16


SZUKAJ ([0,7,8,5],1,4,8) {ciąg,lewy=1, prawy=4, x=8}
1>4 Nie ( czy lewy > prawy ? )
0=8 Nie ( czy a[1]=x ? )

Marek Łatko 2005 17


SZUKAJ ([0,7,8,5],1,4,8) {ciąg,lewy=1, prawy=4, x=8}
1>4 Nie ( czy lewy > prawy ? )
0=8 Nie ( czy a[1]=x ? )
SZUKAJ ([0,7,8,5],2,4,8)
2>4 Nie ( czy lewy > prawy ?)
7=8 Nie ( czy a[2]=x ? )

Marek Łatko 2005 18


SZUKAJ ([0,7,8,5],1,4,8) {ciąg,lewy=1, prawy=4, x=8}
1>4 Nie ( czy lewy > prawy ? )
0=8 Nie ( czy a[1]=x ? )
SZUKAJ ([0,7,8,5],2,4,8)
2>4 Nie ( czy lewy > prawy ?)
7=8 Nie ( czy a[2]=x ? )
SZUKAJ ([0,7,8,5],3,4,8)
3>4 Nie ( czy lewy > prawy ? )
8=8 Tak ( czy a[3]=x ? )
” JEST W CIĄGU”

Marek Łatko 2005 19


SZUKAJ ([0,7,8],1,3,5) {ciąg,lewy=1, prawy=4, x=5}
1>3 Nie ( czy lewy > prawy ? )
0=5 Nie ( czy a[1]=x ? )

Marek Łatko 2005 20


SZUKAJ ([0,7,8],1,3,5) {ciąg,lewy=1, prawy=4, x=5}
1>3 Nie ( czy lewy > prawy ? )
0=5 Nie ( czy a[1]=x ? )
SZUKAJ ([0,7,8],2,3,5)
2>3 Nie ( czy lewy > prawy ?)
7=5 Nie ( czy a[2]=x ? )

Marek Łatko 2005 21


SZUKAJ ([0,7,8],1,3,5) {ciąg,lewy=1, prawy=4, x=5}
1>3 Nie ( czy lewy > prawy ? )
0=5 Nie ( czy a[1]=x ? )
SZUKAJ ([0,7,8],2,3,5)
2>3 Nie ( czy lewy > prawy ?)
7=5 Nie ( czy a[2]=x ? )
SZUKAJ ([0,7,8],3,3,5)
3>3 Nie ( czy lewy > prawy ? )
8=5 Nie ( czy a[3]=x ? )

Marek Łatko 2005 22


SZUKAJ ([0,7,8],1,3,5) {ciąg,lewy=1, prawy=4, x=5}
1>3 Nie ( czy lewy > prawy ? )
0=5 Nie ( czy a[1]=x ? )
SZUKAJ ([0,7,8],2,3,5)
2>3 Nie ( czy lewy > prawy ?)
7=5 Nie ( czy a[2]=x ? )
SZUKAJ ([0,7,8],3,3,5)
3>3 Nie ( czy lewy > prawy ? )
8=5 Nie ( czy a[3]=x ? )
SZUKAJ ([0,7,8],4,3,5)
4>3 Tak ( czy lewy > prawy ? )
” BRAK W CIĄGU”
Marek Łatko 2005 23
Algorytm ten posiada dwie ważne cechy
algorytmów rekurencyjnych:
1) zakończenie rekurencji jest jasno określone:
- znaleziono element ( a[lewy] = x )
lub
- przekroczono zakres tablicy ( lewy > prawy )

Marek Łatko 2005 24


Algorytm ten posiada dwie ważne cechy
algorytmów rekurencyjnych:
1) zakończenie rekurencji jest jasno określone:
- znaleziono element ( a[lewy] = x )
lub
- przekroczono zakres tablicy ( lewy > prawy )

2) duży problem został rozbity na dwa mniejsze:


1-szy - elementarny
2-gi - na analogiczny problem, tylko o
mniejszym rozmiarze
Marek Łatko 2005 25
Przykład 2

Problem:
Znaleźć największy i najmniejszy element w
zbiorze n-elementowym S.
Załóżmy dodatkowo, że n jest potęgą liczby 2.

Np. dla n=23=8 mamy zbiór:

{ 2, 5, 23, -12, 0, 45, -100, 9 }

Marek Łatko 2005 26


Rozwiązanie:
DZIEL:
Podziel zbiór S na dwa podzbiory S1 i S2, z których
każdy zawiera n/2 elementów.

Marek Łatko 2005 27


Rozwiązanie:
DZIEL:
Podziel zbiór S na dwa podzbiory S1 i S2, z których
każdy zawiera n/2 elementów.

ZWYCIĘŻAJ:
Znajdź minimalne i maksymalne elementy w
zbiorach S1 i S2 a następnie wybierz element
mniejszy z dwóch znalezionych minimów i element
większy z dwóch znalezionych maksimów.

Marek Łatko 2005 28


MAXMIN( S );
{ S- dany zbiór elementów }
początek
1. jeżeli |S|=2 wtedy { |S| oznacza moc zbioru S }
początek
2. { niech S={a, b} }
3. powrót (MAX(a,b), MIN(a,b)) Å STOP !
koniec
w przeciwnym razie
początek
4. podziel S na dwa rozłączne równoliczne podzbiory S1 i S2,
5. (max1, min1):= MAXMIN( S1 );
6. (max2, min2):= MAXMIN( S2 );
7. powrót (MAX(max1, max2), MIN(min1, min2))
koniec
koniec
Marek Łatko 2005 29
Złożoności czasowa algorytmu MAXMIN

Operacja dominująca: porównanie dwóch elementów


Oznaczenie : T(n)
liczba porównań w zbiorze n elementowym.
Mamy więc:

T(2)=1 dla n=2 ( linia 3 )


T(n) liczba porównań w dwóch wywołaniach
MAXMIN czyli w zbiorach n/2 elementowych
( linie 5,6)
plus
dwa porównania dla wyników ( linia 7)
Marek Łatko 2005 30
Dostajemy, więc równanie rekurencyjne

1 dla n = 2
T(n) = 
2T(n/2) + 2 dla n > 2

Marek Łatko 2005 31


Dostajemy, więc równanie rekurencyjne

1 dla n = 2
T(n) = 
2T(n/2) + 2 dla n > 2

którego rozwiązanie jest następujące:

T(n) = ⋅ n − 2.
3
2

Marek Łatko 2005 32


Dostajemy, więc równanie rekurencyjne

1 dla n = 2
T(n) = 
2T(n/2) + 2 dla n > 2

którego rozwiązanie jest następujące:

T(n) = ⋅ n − 2.
3
2

a więc T(n)=O(n).
Marek Łatko 2005 33
Funkcja SILNIA ( n! )

Definicja funkcji f(n)=n!

0! = 1
n! = 1⋅2⋅.....⋅(n-1) ⋅n

Marek Łatko 2005 34


Funkcja SILNIA ( n! )

Definicja funkcji f(n)=n!

0! = 1
n! = 1⋅2⋅.....⋅(n-1) ⋅n

co można łatwo zapisać w postaci rekurencyjnej:

1 dla n = 0
n!= 
n ⋅ (n − 1) ! dla n > 0

Marek Łatko 2005 35


Algorytm w postaci pseudokodu:

Funkcja SILNIA(n);
początek
jeżeli n = 0 wtedy pisz (1)
w przeciwnym wypadku
pisz (n*SILNIA(n-1))
koniec

Marek Łatko 2005 36


Schemat realizacji funkcji SILNIA(3)
SILNIA(3)
3≤0 NIE 3! = 3•2!

Marek Łatko 2005 37


Schemat realizacji funkcji SILNIA(3)
SILNIA(3)
3≤0 NIE 3! = 3•2!

2≤0 NIE 2! = 2•1!

Marek Łatko 2005 38


Schemat realizacji funkcji SILNIA(3)
SILNIA(3)
3≤0 NIE 3! = 3•2!

2≤0 NIE 2! = 2•1!

1≤0 NIE 1! = 1•0!

Marek Łatko 2005 39


Schemat realizacji funkcji SILNIA(3)
SILNIA(3)
3≤0 NIE 3! = 3•2!

2≤0 NIE 2! = 2•1!

1≤0 NIE 1! = 1•0!

0≤0 TAK

Marek Łatko 2005 40


Schemat realizacji funkcji SILNIA(3)
SILNIA(3)
3≤0 NIE 3! = 3•2!

2≤0 NIE 2! = 2•1!

1≤0 NIE 1! = 1•0!

0≤0 TAK 0! = 1

Marek Łatko 2005 41


Schemat realizacji funkcji SILNIA(3)
SILNIA(3)
3≤0 NIE 3! = 3•2!

2≤0 NIE 2! = 2•1!

1≤0 NIE 1! = 1•0!

0≤0 TAK 0! = 1

Marek Łatko 2005 42


Schemat realizacji funkcji SILNIA(3)
SILNIA(3)
3≤0 NIE 3! = 3•2!

2≤0 NIE 2! = 2•1!

1≤0 NIE 1! = 1•0! 1! =1•1=1

Marek Łatko 2005 43


Schemat realizacji funkcji SILNIA(3)
SILNIA(3)
3≤0 NIE 3! = 3•2!

2≤0 NIE 2! = 2•1!

1! =1•1=1

Marek Łatko 2005 44


Schemat realizacji funkcji SILNIA(3)
SILNIA(3)
3≤0 NIE 3! = 3•2!

2≤0 NIE 2! = 2•1! 2! =2•1=2

Marek Łatko 2005 45


Schemat realizacji funkcji SILNIA(3)
SILNIA(3)
3≤0 NIE 3! = 3•2!

2! = 2•1!=2 •1

Marek Łatko 2005 46


Schemat realizacji funkcji SILNIA(3)
SILNIA(3)
3≤0 NIE 3! = 3•2! 3! =3•2=6

Marek Łatko 2005 47


Schemat realizacji funkcji SILNIA(3)
SILNIA(3) 6

Marek Łatko 2005 48


Schemat realizacji funkcji SILNIA(3)
SILNIA(3)
3≤0 NIE 3! = 3•2! 3! =3•2=3

2≤0 NIE 2! = 2•1! 2! =2•1=2

1≤0 NIE 1! = 1•0! 1! =1•1=1

0≤0 TAK 0! = 1

Marek Łatko 2005 49


Sposób działania:

Dla n = 0 nie następuje wywołanie rekurencyjne

Marek Łatko 2005 50


Sposób działania:

Dla n = 0 nie następuje wywołanie rekurencyjne


Dla n > 0 kolejne wywołanie rekurencyjne dla
argumentu mniejszego o 1 aż do
wywołanie z argumentem 0

Marek Łatko 2005 51


OGÓLNIE:
Zależność, której spełnienie przez algorytm wywołania
gwarantuje uniknięcie dalszej rekursji, nazywamy przypadkiem
bazowym lub warunkiem stopu rekursji .

Marek Łatko 2005 52


OGÓLNIE:
Zależność, której spełnienie przez algorytm wywołania
gwarantuje uniknięcie dalszej rekursji, nazywamy przypadkiem
bazowym lub warunkiem stopu rekursji .

UWAGA:
Każde wywołanie rekursywne zajmuje pewien obszaru pamięci
(zorganizowana jako stos). W przypadku bardzo dużej liczby
wywołań rekurencyjnych szybko może nastąpić przepełnienie
stosu, a w konsekwencji przerwanie pracy procedury.

Marek Łatko 2005 53


Ciąg Fibonacciego

Definicja ciągu Fibonacciego


f(0) = 1
f(1) = 1
f(n) = f(n-1) + f(n-2) dla n ≥ 2
Początkowe wyrazy ciągu:

1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...

Marek Łatko 2005 54


Funkcja Fibo(n);
początek
jeżeli n ≤ 1 wtedy Fibo:=1
w przeciwnym razie Fibo:=Fibo(n-1) + Fibo(n-2)
koniec;

Marek Łatko 2005 55


Schemat wywołań funkcji Fibo dla n = 4

F(4)

Marek Łatko 2005 56


Schemat wywołań funkcji Fibo dla n = 4

F(4)

F(3)

Marek Łatko 2005 57


Schemat wywołań funkcji Fibo dla n = 4

F(4)

F(3) F(2)

Marek Łatko 2005 58


Schemat wywołań funkcji Fibo dla n = 4

F(4)

F(3) F(2)

F(2) F(1)

Marek Łatko 2005 59


Schemat wywołań funkcji Fibo dla n = 4

F(4)

F(3) F(2)

F(2) F(1) F(1) F(0)

Marek Łatko 2005 60


Schemat wywołań funkcji Fibo dla n = 4

F(4)

F(3) F(2)

F(2) F(1) F(1) F(0)

F(1) F(0)

Marek Łatko 2005 61


Schemat wywołań funkcji Fibo dla n = 4

F(4)

F(3) F(2)

F(2) F(1) F(1) F(0)

F(1) F(0)

F(4) = F(3) + F(2)

Marek Łatko 2005 62


Schemat wywołań funkcji Fibo dla n = 4

F(4)

F(3) F(2)

F(2) F(1) F(1) F(0)

F(1) F(0)

F(4) = F(3) + F(2) = F(2) + F(1)

Marek Łatko 2005 63


Schemat wywołań funkcji Fibo dla n = 4

F(4)

F(3) F(2)

F(2) F(1) F(1) F(0)

F(1) F(0)

F(4) = F(3) + F(2) = F(2) + F(1) + F(1) + F(0) =

Marek Łatko 2005 64


Schemat wywołań funkcji Fibo dla n = 4

F(4)

F(3) F(2)

F(2) F(1) F(1) F(0)

F(1) F(0)

F(4) = F(3) + F(2) = F(2) + F(1) + F(1) + F(0) =


= F(1) + F(0)
Marek Łatko 2005 65
Schemat wywołań funkcji Fibo dla n = 4

F(4)

F(3) F(2)

F(2) F(1) F(1) F(0)

F(1) F(0)

F(4) = F(3) + F(2) = F(2) + F(1) + F(1) + F(0) =


= F(1) + F(0) + F(1) + F(1) + F(0) =
Marek Łatko 2005 66
Schemat wywołań funkcji Fibo dla n = 4

F(4)

F(3) F(2)

F(2) F(1) F(1) F(0)

F(1) F(0)

F(4) = F(3) + F(2) = F(2) + F(1) + F(1) + F(0) =


= F(1) + F(0) + F(1) + F(1) + F(0) = 2*F(0) + 3*F(1)
Marek Łatko 2005 67
Schemat wywołań funkcji Fibo dla n = 4

F(4)

F(3) F(2)

F(2) F(1) F(1) F(0)

F(1) F(0)

F(4) = F(3) + F(2) = F(2) + F(1) + F(1) + F(0) =


= F(1) + F(0) + F(1) + F(1) + F(0) = 2*F(0) + 3*F(1)
= (1+1) + (1+1+1) = 2 + 3Marek
= Łatko
5 2005 68
Złożoność czasowa algorytmu FIBO:

T(n) = (1,6)n

Dla n=30 F(30) ma 832040 wywołań funkcji


F(0) i F(1).

(1,6)30=1 329 228

Metoda iteracyjna: tylko 30 dodawań !


Marek Łatko 2005 69
NWP - rekurencyjny algorytm Euklidesa
Definicja
Największym wspólnym podzielnikiem ( ozn. NWP )
dwu liczb całkowitych nazywamy największą liczbę będącą
podzielnikiem ich obu.

Marek Łatko 2005 70


NWP - rekurencyjny algorytm Euklidesa
Definicja
Największym wspólnym podzielnikiem ( ozn. NWP )
dwu liczb całkowitych nazywamy największą liczbę będącą
podzielnikiem ich obu.
Zależność rekurencyjna podana przez Euklidesa w IV wieku
p.n.e.

n gdy m mod n = 0
NWP(m, n) = 
 NWP(n, m mod n) gdy m mod n ≠ 0

gdzie m,n >0

Marek Łatko 2005 71


Przykład:

Obliczyć NWP dla dwóch liczb całkowitych: 243 i 114.


Mamy
NWP(243,114)

Marek Łatko 2005 72


Przykład:

Obliczyć NWP dla dwóch liczb całkowitych: 243 i 114.


Mamy
NWP(243,114) = NWP(114,15)

Marek Łatko 2005 73


Przykład:

Obliczyć NWP dla dwóch liczb całkowitych: 243 i 114.


Mamy
NWP(243,114) = NWP(114,15) = NWP(15,9)

Marek Łatko 2005 74


Przykład:

Obliczyć NWP dla dwóch liczb całkowitych: 243 i 114.


Mamy
NWP(243,114) = NWP(114,15) = NWP(15,9) =
NWP(9,6)

Marek Łatko 2005 75


Przykład:

Obliczyć NWP dla dwóch liczb całkowitych: 243 i 114.


Mamy
NWP(243,114) = NWP(114,15) = NWP(15,9) =
NWP(9,6) = NWP(6,3)

Marek Łatko 2005 76


Przykład:

Obliczyć NWP dla dwóch liczb całkowitych: 243 i 114.


Mamy
NWP(243,114) = NWP(114,15) = NWP(15,9) =
NWP(9,6) = NWP(6,3) = NWP(3,0)

Marek Łatko 2005 77


Przykład:

Obliczyć NWP dla dwóch liczb całkowitych: 243 i 114.


Mamy
NWP(243,114) = NWP(114,15) = NWP(15,9) =
NWP(9,6) = NWP(6,3) = NWP(3,0) = 3

Marek Łatko 2005 78


Funkcja EUKLID w postaci pseudokodu:

Funkcja EUKLID(m, n);


{zakładamy, że m≥0, n≥0}
początek
jeżeli n=0 wtedy EUKLID:=m
w przeciwnym razie
EUKLID:= EUKLID (n, m mod n)
koniec;

Marek Łatko 2005 79


. Dla m=30 i n=21 kolejne wywołania funkcji EUKLID są
następujące:

EUKLID(30,21) Æ

Marek Łatko 2005 80


. Dla m=30 i n=21 kolejne wywołania funkcji EUKLID są
następujące:

EUKLID(30,21) Æ EUKLID(21,9) Æ

Marek Łatko 2005 81


. Dla m=30 i n=21 kolejne wywołania funkcji EUKLID są
następujące:

EUKLID(30,21) Æ EUKLID(21,9) Æ
EUKLID(9,3) Æ

Marek Łatko 2005 82


. Dla m=30 i n=21 kolejne wywołania funkcji EUKLID są
następujące:

EUKLID(30,21) Æ EUKLID(21,9) Æ
EUKLID(9,3) Æ EUKLID(3,0) = 3

Marek Łatko 2005 83


. Dla m=30 i n=21 kolejne wywołania funkcji EUKLID są
następujące:

EUKLID(30,21) Æ EUKLID(21,9) Æ
EUKLID(9,3) Æ EUKLID(3,0) = 3
Mamy tu:
•trzy rekurencyjne wywołania funkcji EUKLID

Marek Łatko 2005 84


. Dla m=30 i n=21 kolejne wywołania funkcji EUKLID są
następujące:

EUKLID(30,21) Æ EUKLID(21,9) Æ
EUKLID(9,3) Æ EUKLID(3,0) = 3
Mamy tu:
•trzy rekurencyjne wywołania funkcji EUKLID
•zmniejszanie się wartość drugiego argumentu, czyli
funkcja EUKLID zawsze się kończy i oblicza poprawny wynik.

Marek Łatko 2005 85


. Dla m=30 i n=21 kolejne wywołania funkcji EUKLID są
następujące:

EUKLID(30,21) Æ EUKLID(21,9) Æ
EUKLID(9,3) Æ EUKLID(3,0) = 3
Mamy tu:
•trzy rekurencyjne wywołania funkcji EUKLID
•zmniejszanie się wartość drugiego argumentu, czyli
funkcja EUKLID zawsze się kończy i oblicza poprawny wynik.
Liczba wywołań rekurencyjnych funkcji EUKLID dla m>n>0
wynosi: O(log n).

Marek Łatko 2005 86


Algorytm Start
Euklidesa

Marek Łatko 2005 87


Algorytm Start
Euklidesa
a,b

Marek Łatko 2005 88


Algorytm Start
Euklidesa
a,b

Tak Nie
a<>b

Marek Łatko 2005 89


Algorytm Start
Euklidesa
a,b

Tak Nie
a<>b

a>b
Tak Nie

Marek Łatko 2005 90


Algorytm Start
Euklidesa
a,b

Tak Nie
a<>b

a>b
Tak Nie

a:= a-b

Marek Łatko 2005 91


Algorytm Start
Euklidesa
a,b

Tak Nie
a<>b

a>b
Tak Nie

a:= a-b b:= b-a

Marek Łatko 2005 92


Algorytm Start
Euklidesa
a,b

Tak Nie
a<>b
a
a>b
Tak Nie

a:= a-b b:= b-a

Marek Łatko 2005 93


Algorytm Start
Euklidesa
a,b

Tak Nie
a<>b
a
a>b
Tak Nie Koniec
a:= a-b b:= b-a

Marek Łatko 2005 94


Wieża Hanoi
Mamy trzy kołki i n krążków, które można nakładać na te
kołki. Krążki mają różne wielkości. Na początku wszystkie
krążki są na lewym kołku A nałożone w kolejności od
największego do najmniejszego.
A B C

Marek Łatko 2005 95


Wieża Hanoi
Mamy trzy kołki i n krążków, które można nakładać na te
kołki. Krążki mają różne wielkości. Na początku wszystkie
krążki są na lewym kołku A nałożone w kolejności od
największego do najmniejszego.
A B C

Zadanie:
Przenieść wszystkie krążki na prawy kołek C wg zasad:
1. za jednym razem można zmienić położenie tylko jednego
krążka
2. żadnego krążka nie można umieścić na mniejszym krążku
Marek Łatko 2005 96
Wieża Hanoi

A B C

A B C

Marek Łatko 2005 97


Marek Łatko 2005 98
Marek Łatko 2005 99
Marek Łatko 2005 100
Marek Łatko 2005 101
Marek Łatko 2005 102
Marek Łatko 2005 103
Marek Łatko 2005 104
Marek Łatko 2005 105
Złożoność czasowa problemu Wieża Hanoi
Zależność rekurencyjna:

T1 = 1
Tn = 2Tn-1 +1
Funkcja złożoności czasowej:

T(n) = 2n - 1

Dla n=40 przy szybkości 1 przełożenie w 1 sekundzie


240-1 sekund = 1 099 511 627 775 sekund
to jest około 348 000 lat.
Marek Łatko 2005 106
KONIEC

Marek Łatko 2005 107

You might also like