KWALIFIKACJA INF2 + INF3 - STYCZEŃ 2011

PYTANIE NR 26.
Przedstawiony program realizuje algorytm
Ilustracja przedstawia fragment kodu źródłowego w języku programowania C++.
A.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
Algorytm rekurencyjny rozpoznaje się po tym, że funkcja lub procedura w swoim ciele wywołuje samą siebie i posiada przypadek bazowy (warunek zakończenia). Iteracja opiera się na pętlach, "podstawieniowy" nie jest typową klasyfikacją algorytmu, a "sortujący" dotyczy celu (sortowania), nie samej techniki sterowania.

Pełne wyjaśnienie:

Algorytm rekurencyjny to taki, w którym rozwiązanie problemu jest zdefiniowane przez odwołanie do tego samego problemu dla mniejszego przypadku. W kodzie źródłowym najczęściej widać to jako sytuację, gdy funkcja/procedura wywołuje samą siebie (bezpośrednio) albo prowadzi do własnego wywołania pośrednio. Kluczowym elementem poprawnej rekurencji jest przypadek bazowy, czyli warunek, w którym dalsze wywołania nie następują i można zwrócić wynik.

Odpowiedź "rekurencyjny." jest poprawna, gdy przedstawiony program zawiera samowywołanie oraz warunek stopu. To odróżnia rekurencję od zwykłego powtarzania instrukcji.

Dlaczego pozostałe odpowiedzi nie pasują:

  • "iteracyjny." – iteracja polega na powtarzaniu bloku instrukcji przy użyciu pętli (np. for, while) i zwykle nie wymaga stosu wywołań funkcji. Program może wykonywać podobne kroki, ale jeśli robi to poprzez samowywołania funkcji, to jest to rekurencja, nie iteracja.
  • "sortujący." – to określenie celu algorytmu (sortowanie danych). Rekurencja/iteracja opisuje technikę realizacji. Wiele algorytmów sortowania może być rekurencyjnych, ale samo słowo "sortujący" nie wynika wyłącznie ze struktury wywołań; trzeba by jeszcze rozpoznać, że program porządkuje elementy według klucza.
  • "podstawieniowy." – nie jest to standardowa, powszechnie nauczana kategoria algorytmu w tym kontekście. W zadaniach egzaminacyjnych częściej klasyfikuje się algorytmy jako rekurencyjne, iteracyjne, zachłanne, dynamiczne, dziel-i-zwyciężaj itp.

Wskazówka egzaminacyjna: aby pewnie rozpoznać rekurencję, szukaj (1) samowywołania funkcji oraz (2) warunku, który zatrzymuje dalsze wywołania. Brak warunku stopu oznacza ryzyko nieskończonej rekurencji i w praktyce błąd wykonania (np. przepełnienie stosu).

Dodatkowe pytania

Dodatkowe pytania (FAQ):
Algorytm rekurencyjny to taki, w którym funkcja/procedura rozwiązuje problem, wywołując samą siebie dla mniejszego przypadku. Musi istnieć przypadek bazowy (warunek stopu), aby rekurencja zakończyła się i zwróciła wynik.
Szukaj wywołania tej samej funkcji w jej własnym ciele (np. f() wywołuje f()). Sprawdź też, czy jest warunek zakończenia, który zatrzymuje kolejne wywołania. Bez niego program może wejść w nieskończoną rekurencję.
Rekurencja używa wywołań funkcji (często korzysta ze stosu wywołań), a iteracja opiera się na pętlach i zmiennych sterujących. Obie techniki mogą rozwiązywać ten sam problem, ale różnią się sposobem kontroli przepływu programu.
Przypadek bazowy zatrzymuje dalsze wywołania i pozwala zacząć "zawijanie" wyników z powrotem do pierwszego wywołania. Bez warunku stopu liczba wywołań rośnie aż do błędu wykonania (np. przepełnienia stosu) lub zawieszenia programu.
Nie zawsze. Rekurencja bywa czytelniejsza i naturalna dla struktur drzewiastych, ale ma narzut wywołań funkcji i ryzyko dużej głębokości stosu. Iteracja często jest bardziej pamięciooszczędna, jednak czas i pamięć zależą od konkretnej implementacji.
Stos wywołań to mechanizm, w którym środowisko uruchomieniowe przechowuje informacje o aktywnych wywołaniach funkcji. W rekurencji każde kolejne wywołanie dokłada nową "ramkę" na stos. Zbyt duża głębokość może spowodować błąd przepełnienia stosu.
Tak. Istnieją sortowania często implementowane rekurencyjnie (np. dziel i zwyciężaj). Jednak samo stwierdzenie "sortujący" opisuje cel (porządkowanie danych), a nie technikę sterowania. W zadaniach warto odróżniać co robi algorytm od jak to robi.
Najczęściej myli się rekurencję z iteracją (bo oba podejścia się "powtarzają"), pomija się warunek stopu albo uznaje za rekurencję każde wywołanie funkcji. Pomaga zasada: musi być samowywołanie i przypadek bazowy.
Zwykle zastępuje się wywołania rekurencyjne pętlą oraz strukturą danych, która przechowa stan (często własny stos lub kolejkę). Kluczowe jest przeniesienie tego, co było "zapamiętywane" na stosie wywołań, do jawnych zmiennych lub kolekcji.
Ćwicz rozpoznawanie w kodzie: samowywołania, przypadku bazowego i zmniejszania problemu. Rozwiązuj proste przykłady (silnia, Fibonacci, przeszukiwanie drzewa) i ucz się wskazywać, czy dany zapis używa pętli (iteracja) czy wywołań funkcji (rekurencja).
info

To pytanie poprawnie rozwiązuje 46% zdających egzamin. trudne

Eksperci podkreślają: "Algorytm rekurencyjny rozpoznaje się po tym, że funkcja lub procedura w swoim ciele wywołuje samą siebie i posiada przypadek bazowy (warunek zakończenia)."

Źródła:

  • MDN Web Docs: "Recursion" – https://developer.mozilla.org/en-US/docs/Glossary/Recursion (dostęp: 2026-02-28)
  • Wikipedia (PL): "Rekurencja (informatyka)" – https://pl.wikipedia.org/wiki/Rekurencja_(informatyka) (dostęp: 2026-02-28)
  • Wikipedia (PL): "Iteracja" – https://pl.wikipedia.org/wiki/Iteracja (dostęp: 2026-02-28)

Materiały:

  • Dokumentacja języka używanego na zajęciach (sekcja o funkcjach i wywołaniach)
  • MDN Web Docs – materiały o funkcjach, stosie wywołań i rekurencji
  • Podręczniki do podstaw algorytmiki (rozdziały: rekurencja, iteracja, złożoność)

Aktualizacja pytania: 31.03.2026



Aktualizacja pytania: 31.03.2026
📡 Brak połączenia internetowego