Rekurencyjnepodejście rekurencyjneRekurencyjneiteracyjnepodejś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