KWALIFIKACJA INF2 + INF3 - STYCZEŃ 2008

PYTANIE NR 23.
W języku C/C++ w wyniku wywołania funkcji cout << s(4) otrzymano liczbę



                int s (int n) 
                {if (n>1) return n*s(n-1); 
                 else return 1;} 




A.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
Funkcja s(n) jest rekurencyjna: dla n>1 zwraca n*s(n-1), a dla n<=1 zwraca 1 (warunek stopu). Zatem s(4)=4*s(3)=4*3*s(2)=4*3*2*s(1)=4*3*2*1=24, więc wypisane zostanie 24.

Pełne wyjaśnienie:

W pokazanym kodzie zdefiniowano funkcję:

  • dla n > 1 zwraca wartość n * s(n-1), czyli wywołuje samą siebie z mniejszym argumentem,
  • dla n <= 1 zwraca 1 – to tzw. warunek stopu, bez którego rekurencja nie zakończyłaby się poprawnie.

Tak zdefiniowana funkcja oblicza silnię (factorial) liczby naturalnej: n!. Aby policzyć wynik dla wywołania s(4), można rozpisać kolejne wywołania:

s(4) zwraca 4 * s(3)
s(3) zwraca 3 * s(2)
s(2) zwraca 2 * s(1)
s(1) spełnia warunek n<=1 i zwraca 1

Następnie następuje "odwijanie" rekurencji (powrót z funkcji):

s(2)=2*1=2
s(3)=3*2=6
s(4)=4*6=24

Dlatego poprawny wynik wypisany przez cout << s(4) to 24.

Dlaczego pozostałe odpowiedzi nie pasują?

  • 4 wynika z typowego błędu polegającego na utożsamieniu wyniku funkcji z jej argumentem, ale funkcja wykonuje mnożenia rekurencyjne.
  • 1 to wartość zwracana tylko w przypadku bazowym (gdy n<=1), a tutaj startujemy od n=4.
  • 120 to 5!, więc byłoby poprawne dla wywołania s(5), nie dla s(4).

Wskazówka egzaminacyjna: w zadaniach z rekurencją zawsze sprawdź warunek stopu i policz 2–3 pierwsze rozwinięcia, a potem wykonaj "odwijanie" krok po kroku.

Dodatkowe pytania

Dodatkowe pytania (FAQ):
Rekurencja to technika, w której funkcja wywołuje samą siebie, aby rozbić problem na mniejsze podproblemy. Kluczowy jest warunek stopu, który kończy łańcuch wywołań. Bez niego program może zakończyć się błędem przepełnienia stosu.
Warunek stopu (przypadek bazowy) zapewnia zakończenie wywołań. Gdy argument osiągnie wartość graniczną, funkcja zwraca prosty wynik i zaczyna się "odwijanie" rekurencji. Bez tego liczba wywołań rośnie bez końca i stos wywołań się przepełnia.
Zapis cout << s(4) oznacza: oblicz wartość zwracaną przez funkcję s dla argumentu 4, a następnie wypisz ją na standardowe wyjście. Operator << w tym kontekście służy do strumieniowego wypisywania.
Rozwiń wywołania: s(4)=4*s(3), s(3)=3*s(2), s(2)=2*s(1), a s(1)=1. Potem "odwiń" wynik: s(2)=2, s(3)=6, s(4)=24. To typowy schemat liczenia rekurencji na egzaminie.
Tak, dla argumentów całkowitych dodatnich funkcja zwraca iloczyn liczb od 1 do n, czyli silnię n!. Wynika to z definicji: dla n>1 mnożymy przez wynik dla n-1, a dla n=1 zwracamy 1 jako przypadek bazowy.
Rekurencja bywa gorsza, gdy liczba wywołań jest duża, bo zużywa pamięć stosu i ma narzut czasowy na wywołania funkcji. Dla silni często prościej i wydajniej użyć pętli. Rekurencja jest za to czytelna przy strukturach drzewiastych (np. przeglądanie DOM).
Najczęstsze błędy to: brak lub zły warunek stopu, mylenie n! z sumą liczb, błędne podstawianie argumentu (np. użycie s(n) zamiast s(n-1)) oraz liczenie tylko jednego kroku bez "odwijania" rekurencji do końca.
Silnia rośnie bardzo szybko: 4!=24, a 5!=120. Jeśli ktoś automatycznie dopisze jeden czynnik za dużo (np. pomyli argument i policzy 1·2·3·4·5), dostanie 120. Poprawne śledzenie argumentu w wywołaniach usuwa ten błąd.
W tej definicji dla n<=1 zwracane jest 1, więc s(0) zwróci 1. To jest zgodne z matematyczną konwencją 0!=1. W praktyce warto jednak jawnie przemyśleć obsługę wartości ujemnych, bo dla nich też zwróci 1.
Szukaj wzorca: funkcja zwraca n * f(n-1) oraz ma przypadek bazowy zwracający 1 (często dla n==0 lub n==1). Jeśli widzisz mnożenie przez wynik z mniejszego argumentu i bazę 1, to niemal na pewno silnia.
info

Statystycznie 65% uczniów zna prawidłową odpowiedź. średnie

W praktyce zawodowej kluczowe jest to, że funkcja s(n) jest rekurencyjna: dla n&gt;1 zwraca n*s(n-1), a dla n&lt;=1 zwraca 1 (warunek stopu).

Źródła:

  • cppreference.com – recursion (C++ language) – https://en.cppreference.com/w/cpp/language (dostęp: 2026-03-01)
  • cppreference.com – return statement (C++ language) – https://en.cppreference.com/w/cpp/language/return (dostęp: 2026-03-01)
  • Wikipedia (PL) – Silnia – https://pl.wikipedia.org/wiki/Silnia (dostęp: 2026-03-01)

Materiały:

  • Dokumentacja języka C++ (rekurencja, funkcje, instrukcja return)
  • Materiały szkolne o stosie wywołań i śledzeniu przebiegu programu (debugger)
  • Zadania treningowe: silnia iteracyjnie vs rekurencyjnie, porównanie działania

Aktualizacja pytania: 31.03.2026



Aktualizacja pytania: 31.03.2026
📡 Brak połączenia internetowego