app 10 rekurencja
Post on 01-Jul-2015
154 Views
Preview:
TRANSCRIPT
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
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.
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:
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).
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.
Podprogramy rekurencyjne 6
Przykład. Funkcja potęga
Program. Potega_Rekurencyjnie
Program. Potega_Iteracyjnie
Przykład. Funkcja silnia
Program. Silnia_Rekurencyjnie
Program. Silnia_Iteracyjnie
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
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.
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
Podprogramy rekurencyjne 10
Program. Wieze_Hanoi
1 2 3
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
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.
top related