Rekurencyjnepodejście rekurencyjneRekurencyjne i iteracyjnepodejście iteracyjneiteracyjne podejście do rozwiązywania problemów algorytmicznych omówimy na przykładzie zadania maturalnego, w którym należy wyznaczyć liczby względnie pierwsze.
Zadanie 1. Iteracyjna alternatywa
Dana jest następująca funkcja rekurencyjna:
Linia 1. funkcja wynik otwórz nawias okrągły i zamknij nawias okrągły.
Linia 2. jeżeli i otwórz nawias ostrokątny 3 dwukropek.
Linia 3. zwróć 1 i zakończ średnik.
Linia 4. w przeciwnym razie dwukropek.
Linia 5. jeżeli i mod 2 znak równości 0 dwukropek.
Linia 6. zwróć wynik otwórz nawias okrągły i – 2 zamknij nawias okrągły plus wynik otwórz nawias okrągły i – 1 zamknij nawias okrągły.
Linia 7. w przeciwnym razie dwukropek.
Linia 8. zwróć wynik otwórz nawias okrągły i – 1 zamknij nawias okrągły mod 7.
Uwaga: Operator mod oznacza resztę z dzielenia.
Zapisz za pomocą pseudokodu lub w wybranym języku programowania program, który wyznaczy wartość wynik(100) bez wywołań rekurencyjnych.
Zadanie opracowano na podstawie zadania Centralnej Komisji Egzaminacyjnej, które pojawiło się w zbiorze zadań do egzaminu maturalnego z informatyki. Cały arkusz można znaleźć na stronie internetowej CKE.
Przedstaw rozwiązanie zadania w postaci programu w języku C++, Java lub Python.
Rozwiązanie
Iteracyjnie obliczymy kolejne wywołania funkcji wynik() i zapiszemy je w tablicy. Definiujemy tablicę o rozmiarze równym 100:
Linia 1. Wyniki otwórz nawias kwadratowy 1 kropka kropka 100 zamknij nawias kwadratowy ← tablica liczb naturalnych.
Rekurencja kończy się, jeżeli argument jest mniejszy niż 3 i zwraca wartość 1. W związku z tym do pierwszych dwóch elementów tablicy przypiszemy wartość 1:
Linia 1. Wyniki otwórz nawias kwadratowy 1 kropka kropka 100 zamknij nawias kwadratowy ← tablica liczb naturalnych.
Linia 2. Wyniki otwórz nawias kwadratowy 1 zamknij nawias kwadratowy ← 1.
Linia 3. Wyniki otwórz nawias kwadratowy 2 zamknij nawias kwadratowy ← 1.
Każde kolejne wywołanie funkcji w wersji rekurencyjnej potrzebuje - w zależności od parzystości - albo jednego, albo dwóch poprzednich wywołań. Skoro dwa pierwsze elementy mamy zdefiniowane, możemy zadeklarować pętlę od 3 do 100 wypełniającą tablicę Wyniki na podstawie elementów na wcześniejszych indeksach:
Linia 1. Wyniki otwórz nawias kwadratowy 1 kropka kropka 100 zamknij nawias kwadratowy ← tablica liczb naturalnych.
Linia 2. Wyniki otwórz nawias kwadratowy 1 zamknij nawias kwadratowy ← 1.
Linia 3. Wyniki otwórz nawias kwadratowy 2 zamknij nawias kwadratowy ← 1.
Linia 5. dla i znak równości 3 przecinek 4 przecinek kropka kropka kropka przecinek 100 wykonuj dwukropek.
Jeżeli i jest parzyste, wartość kolejnego elementu tablicy jest równa sumie dwóch poprzednich (czyli tak jak w ciągu Fibonacciego). W przeciwnym wypadku jest to reszta z dzielenia poprzedniego elementu przez 7. Po wyjściu z pętli zwracamy odpowiedź.
Linia 1. Wyniki otwórz nawias kwadratowy 1 kropka kropka 100 zamknij nawias kwadratowy ← tablica liczb naturalnych.
Linia 2. Wyniki otwórz nawias kwadratowy 1 zamknij nawias kwadratowy ← 1.
Linia 3. Wyniki otwórz nawias kwadratowy 2 zamknij nawias kwadratowy ← 1.
Linia 5. dla i znak równości 3 przecinek 4 przecinek kropka kropka kropka przecinek 100 wykonuj dwukropek.
Linia 6. jeżeli i mod 2 znak równości 0 dwukropek.
Linia 7. Wyniki otwórz nawias kwadratowy i zamknij nawias kwadratowy ← Wyniki otwórz nawias kwadratowy i minus 1 zamknij nawias kwadratowy plus Wyniki otwórz nawias kwadratowy i minus 2 zamknij nawias kwadratowy.
Linia 8. w przeciwnym wypadku dwukropek.
Linia 9. Wyniki otwórz nawias kwadratowy i zamknij nawias kwadratowy ← Wyniki otwórz nawias kwadratowy i minus 1 zamknij nawias kwadratowy mod 7.
Linia 10. zwróć Wyniki otwórz nawias kwadratowy 100 zamknij nawias kwadratowy.
W ten sposób wyliczymy wartość wywołania wynik(100) bez jakichkolwiek wywołań rekurencyjnych.
Słownik
podejście iteracyjne
podejście iteracyjne
podejście, w którym do zastosowania algorytmu użyjemy pętli
podejście rekurencyjne
podejście rekurencyjne
podejście, w którym do rozwiązania danego problemu użyjemy funkcji wywołującej kolejne wykonanie samej siebie, aż do napotkania przypadku podstawowego