KWALIFIKACJA INF2 + INF3 - CZERWIEC 2015

PYTANIE NR 27.
Przedstawiona poniżej funkcja, generująca liczby Fibbonacciego, jest przykładem funkcji
Ilustracja przedstawia fragment kodu w języku programowania C lub C++, który definiuje funkcję rekurencyjną obliczającą
A.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
Funkcja rekurencyjna to taka, która w swoim ciele wywołuje samą siebie (bezpośrednio lub pośrednio) i ma przypadek bazowy kończący wywołania. Typowa implementacja Fibonacciego często odwołuje się do wcześniejszych wartości przez kolejne wywołania tej samej funkcji, więc jest rekurencyjna.

Pełne wyjaśnienie:

Funkcja jest rekurencyjna, gdy w trakcie działania wywołuje samą siebie (bezpośrednio albo przez inny zestaw wywołań). Kluczowe są dwa elementy:

  • wywołanie rekurencyjne (np. obliczenie F(n) przez odwołanie do F(n-1) i F(n-2)),
  • przypadek bazowy, czyli warunek zatrzymania (np. dla małych n zwracana jest wartość bez kolejnych wywołań), aby uniknąć nieskończonej pętli wywołań.

W kontekście liczb Fibonacciego rekurencja jest naturalna, bo definicja matematyczna opisuje kolejne wyrazy przez wcześniejsze. Jeżeli pokazana funkcja "generująca liczby Fibonacciego" korzysta z takiej definicji i w środku wywołuje samą siebie dla mniejszych argumentów, to klasyfikujemy ją jako rekurencyjną.

Dlaczego pozostałe odpowiedzi nie pasują?

  • "wirtualnej" dotyczy mechanizmu polimorfizmu w programowaniu obiektowym (metody wirtualne są wybierane dynamicznie). To cecha związana z dziedziczeniem i wywołaniem metod, a nie z samowywołaniem funkcji.
  • "o zmiennej liczbie argumentów" (wariadycznej) oznacza, że funkcja może przyjmować różną liczbę parametrów (np. formatowanie tekstu). Funkcja Fibonacciego standardowo przyjmuje stałą liczbę argumentów (najczęściej jeden: n).
  • "niezwracającej wartości liczbowych" sugeruje brak zwracanej liczby (np. typ void). Funkcje obliczające element ciągu zwykle zwracają liczbę; nawet jeśli "generują" kolejne wartości, to typowo albo zwracają liczbę, albo przekazują ją w inny sposób. Sama rekurencja nie zależy od typu zwracanego.

Wskazówka egzaminacyjna: aby rozpoznać rekurencję, szukaj w ciele funkcji jej własnej nazwy w wywołaniu oraz sprawdź, czy istnieje warunek stopu. To szybsze i pewniejsze niż sugerowanie się nazwą zadania ("Fibonacci"), bo ten sam problem można rozwiązać również iteracyjnie.

Dodatkowe pytania

Dodatkowe pytania (FAQ):

Funkcja rekurencyjna to taka, która wywołuje samą siebie (bezpośrednio lub pośrednio), aby rozwiązać problem przez sprowadzenie go do mniejszego podproblemu.

Musi istnieć przypadek bazowy, który kończy dalsze wywołania, inaczej program może się zapętlić lub przepełnić stos.

Szukaj w ciele funkcji wywołania o tej samej nazwie co funkcja. Następnie sprawdź, czy argument w wywołaniu "maleje" (np. n-1) i czy jest warunek stopu (np. dla małych wartości argumentu).

Brak warunku stopu zwykle oznacza błąd lub nieskończoną rekurencję.

Ponieważ matematyczna definicja ciągu Fibonacciego opisuje wyraz przez dwa poprzednie. Rekurencja pozwala zapisać to wprost jako wywołania dla mniejszych argumentów.

W praktyce taka wersja może być wolna bez optymalizacji (np. memoizacji), ale dobrze ilustruje ideę rekurencji.

Nie. Ten sam problem można rozwiązać iteracyjnie (pętlą) albo dynamicznie (tablica, memoizacja). Rekurencyjna jest tylko ta implementacja, w której funkcja wywołuje samą siebie.

Na egzaminie nie zakładaj rekurencji "z nazwy zadania" – sprawdzaj faktycznie strukturę wywołań w kodzie.

Funkcja (metoda) wirtualna to pojęcie z programowania obiektowego: umożliwia dynamiczny wybór implementacji w zależności od rzeczywistego typu obiektu.

Rekurencja dotyczy mechanizmu samowywołania funkcji. To zupełnie inna cecha – funkcja może być wirtualna bez rekurencji i rekurencyjna bez bycia wirtualną.

To funkcja, która może przyjmować różną liczbę parametrów (tzw. funkcja wariadyczna). Przykładem są funkcje formatujące tekst, gdzie liczba argumentów zależy od formatu.

Typowa funkcja obliczająca F(n) ma stałą liczbę argumentów (np. jeden), więc zwykle nie jest wariadyczna.

Częsty błąd to brak lub zły przypadek bazowy, co prowadzi do nieskończonych wywołań. Inny błąd to mylenie rekurencji z pętlą (iteracją) – pętla nie czyni funkcji rekurencyjną.

Uczniowie też mylą pojęcia OOP (wirtualność) z cechami algorytmu (rekurencja).

Rekurencja bywa gorsza, gdy generuje bardzo dużo wywołań i zużywa stos (ryzyko przepełnienia stosu) albo gdy powtarza te same obliczenia, jak w naiwnej wersji Fibonacciego.

Wtedy lepsza jest iteracja lub rekurencja z memoizacją, bo ogranicza liczbę powtórzeń.

Przypadek bazowy to warunek, w którym funkcja zwraca wynik bez dalszych wywołań rekurencyjnych (np. dla najmniejszych wartości argumentu).

Jest potrzebny, aby zakończyć łańcuch wywołań. Bez niego program może wykonywać kolejne wywołania aż do błędu wykonania (np. przepełnienia stosu).

Przećwicz rozpoznawanie: (1) wywołania własnej funkcji, (2) zmniejszania problemu w parametrach, (3) warunku stopu. Rozwiąż kilka przykładów: silnia, Fibonacci, przeszukiwanie drzewa.

Na arkuszu najpierw zaznacz miejsce, gdzie funkcja się wywołuje, a potem sprawdź, czy jest sytuacja, gdy przestaje się wywoływać.

info

Około 62% zdających odpowiada poprawnie na to pytanie. średnie

Specjaliści zwracają uwagę: "Funkcja rekurencyjna to taka, która w swoim ciele wywołuje samą siebie (bezpośrednio lub pośrednio) i ma przypadek bazowy kończący wywołania."

Źródła:

  • Wikipedia (PL): "Rekurencja (informatyka)" – https://pl.wikipedia.org/wiki/Rekurencja_(informatyka) (dostęp: 2026-03-02)
  • Wikipedia (PL): "Ciąg Fibonacciego" – https://pl.wikipedia.org/wiki/Ci%C4%85g_Fibonacciego (dostęp: 2026-03-02)
  • cppreference.com: "Recursion" (C++ glossary/guide) – https://en.cppreference.com/w/cpp/language/recursion (dostęp: 2026-03-02)

Materiały:

  • Dokumentacja języka używanego na zajęciach (sekcja o funkcjach i wywołaniach)
  • Materiał o rekurencji: przypadek bazowy, stos wywołań, ryzyko przepełnienia stosu
  • Przykłady implementacji Fibonacciego: rekurencyjna, iteracyjna, z memoizacją

Aktualizacja pytania: 31.03.2026



Aktualizacja pytania: 31.03.2026
📡 Brak połączenia internetowego