App 10 rekurencja

12
Podprogramy rekurencyjne 1 Podprogram lub strukturę danych nazywamy rekurencyjną, jeżeli częściowo składa się z samej siebie lub jej definicja odwołuje się do niej samej. Przykłady definicji rekurencyjnych stosowanych w matematyce 1. Definicja liczb naturalnych 2. Funkcja silnia 3. Ciąg liczb Fibonacci 4. Potęga naturalna liczby rzeczywistej 5. Wielomiany Legendre’a

Transcript of App 10 rekurencja

Page 1: App 10 rekurencja

Podprogramy rekurencyjne 1

Podprogram lub strukturę danych nazywamy rekurencyjną, jeżeli częściowo składa się z samej siebie lub jej definicja odwołuje się do niej samej.

Przykłady definicji rekurencyjnych stosowanych w matematyce

1. Definicja liczb naturalnych

2. Funkcja silnia

3. Ciąg liczb Fibonacci

4. Potęga naturalna liczby rzeczywistej

5. Wielomiany Legendre’a

Page 2: App 10 rekurencja

Podprogramy rekurencyjne 2

Rekurencja jest użyteczna, bo umożliwia definiowanie nieskończonych zbiorów obiektów przy pomocy skończonych wyrażeń.

Program rekurencyjny P można zapisać jako złożenie instrukcji podstawowych Si nie zawierajęcych P i samego programu P.

P = (Si;P)

Definicja. Jeżeli podprogram P zawiera bezpośrednio odwołanie do samego siebie, to P nazywamy podprogramem bezpośrednio rekurencyjnym.

Page 3: App 10 rekurencja

Podprogramy rekurencyjne 3

Definicja. Jeżeli podprogram P zawiera odwołanie do podprogramu Q, który zawiera bezpośrednie odwołanie do P, to P nazywamy podprogramem pośrednio rekurencyjnym.

Definicja. Wywołaniem rekurencyjnym podprogramu nazywamy wywołanie podprogramu, który zawiera wywołanie samego siebie (pośrednie, lub bezpośrednie)

Podprogramy rekurencyjne umożliwiają wykonywanie nieskończonego procesu obliczeniowego i dlatego powstaje:

Page 4: App 10 rekurencja

Podprogramy rekurencyjne 4

Problem. Zakończenie nieskończonego procesu obliczeniowego w skończonym czasie.

Rozwiązanie. Wywołanie podprogramu P uzależnione jest od warunku W, który w pewnym momencie przestaje być prawdziwy, co kończy proces obliczeniowy.

Zapisujemy to następująco:

P = if W then (Si;P),

albo równoważnie:

P = (Si; if W then P).

Page 5: App 10 rekurencja

Podprogramy rekurencyjne 5

Prostą i skuteczną metodą zatrzymania procesu rekurencyjne-go jest zastosowanie w podprogramie P parametru wejściowego n i wywołanie podprogramu z wartością n-1. Jeżeli W = n > 1, to następujące schematy gwarantują wykonanie podprogramu w skończonej liczbie kroków:

P(n) = if n > 1 then (Si;P(n-1)),

P(n) = (Si; if n > 1 then P(n-1)).Algorytmy rekurencyjne, a co za tym idzie podprogramy

rekurencyjne stosuje się wtedy, gdy rozwiązywany problem, lub przetwarzane dane definiujemy rekurencyjnie.

Nie zawsze algorytm rekurencyjny jest najefektywniejszym rozwiązaniem problemu.

Page 6: App 10 rekurencja

Podprogramy rekurencyjne 6

Przykład. Funkcja potęga

Program. Potega_Rekurencyjnie

Program. Potega_Iteracyjnie

Przykład. Funkcja silnia

Program. Silnia_Rekurencyjnie

Program. Silnia_Iteracyjnie

Page 7: App 10 rekurencja

Podprogramy rekurencyjne 7

Potega_RekX = 2.0, N = 3

Potega_RekX = 2.0, N = 2

Potega_RekX = 2.0, N = 1

Potega_Rek (2.0, 3)

Potega_Rek (2.0, 2)

Potega_Rek (2.0, 1)

WartoϾ obliczona = 2.0

WartoϾ obliczona = 4.0

WartoϾ obliczona = 8.0

Page 8: App 10 rekurencja

Podprogramy rekurencyjne 8

Definicja. Wariantem podstawowym, albo bazowym algorytmu nazywamy wariant, którego rozwiązanie może być wyznaczone bez rekurencji.

Definicja. Wariantem ogólnym algorytmu nazywamy wariant, którego rozwiązanie jest wyrażone w postaci prostszej wersji tego samego wariantu.

Definicja. Algorytmem rekurencyjnym nazywamy algorytm wyznaczający rozwiązanie problemu obliczeniowego wg wariantu ogólnego i wariantu podstawowego (bazowego)

Zadanie. Napisać program wypisujący wartości funkcji Silnia_Rek i Silnia_Iter dla N = 0,1,..,10.

Page 9: App 10 rekurencja

Podprogramy rekurencyjne 9

Pisanie programów rekurencyjnych wymaga:

• Zrozumienia istoty rozwiązywanego problemu

• Zdefiniowania wariantów bazowych

• Zdefiniowania wariantów ogólnych

Zadanie. Napisać funkcje Lucas_Iter i Lucas_Rek obliczające N-ty wyraz ciągu Lucasa określonego wzorami:

L(1) = 1, L(2) = 3,

L(k) = L(k-1) + L(k-2), k>2

Program. Permutacje_Rekurencyjnie

Program. Wypisz_Liste_Rekurencyjnie

Page 10: App 10 rekurencja

Podprogramy rekurencyjne 10

Program. Wieze_Hanoi

1 2 3

Page 11: App 10 rekurencja

Podprogramy rekurencyjne 11

Program. Write_List_In_Reverse_Recursively

Wyszukiwanie. Wyszukiwanie liniowe.

Dane wejściowe: Lista - tablica A(1..n) elementów i element v.

Dane wyjściowe: Indeks i taki, że v = A(i), lub informacja, że v nie jest elementem listy.

Program. Iterative_Version_Of_Sequential_Search

Program. Recursive_Version_Of_Sequential_Search

Page 12: App 10 rekurencja

Podprogramy rekurencyjne 12

Możliwe jest przypadkowe wprowadzenie rekurencji w sytuacji, gdy nazwa podprogramu jest użyta jako identyfikator zmiennej w podprogramie.Zmienna := Nazwa_Podprogramu;

Jeżeli podprogram ma parametry, to kompilator wykryje błąd.

Jeżeli podprogram nie ma parametrów, to może powstać nieskończona rekurencja odpowiadająca pętli nieskończonej.

W takim przypadku wystąpi STORAGE_ERROR.Zadanie. Napisać funkcję obliczającą rekurencyjnie iloczyn M*N dwóch liczb całkowitych dodatnich korzystając wyłącznie z operacji dodawania.