
Silnia to jedno z podstawowych pojęć, z którym spotkasz się podczas nauki matematyki, algorytmiki i programowania. Samo działanie jest proste, ale świetnie pokazuje kilka ważnych mechanizmów – pracę z pętlami, funkcjami oraz rekurencją.
W tym wpisie wyjaśniam, co to jest silnia, jak ją obliczyć ręcznie oraz jak napisać program liczący silnię w Pythonie i C++. Pokażę też rozwiązanie iteracyjne i rekurencyjne oraz najczęstsze błędy pojawiające się w takich zadaniach.
Co to jest silnia?
Silnia liczby naturalnej n to iloczyn wszystkich dodatnich liczb całkowitych od 1 do n.
Silnię zapisujemy za pomocą wykrzyknika:
n!
Przykładowo:
5!
oznacza:
5 × 4 × 3 × 2 × 1
czyli:
5! = 120
Podobnie:
4! = 4 × 3 × 2 × 1 = 24
oraz:
3! = 3 × 2 × 1 = 6
Silnia rośnie bardzo szybko. Już dla stosunkowo niewielkich liczb otrzymujemy duże wyniki.
Przykłady silni
Kilka podstawowych wartości wygląda następująco:
Liczba | Silnia | Wynik |
0 | 0! | 1 |
1 | 1! | 1 |
2 | 2! | 2 |
3 | 3! | 6 |
4 | 4! | 24 |
5 | 5! | 120 |
6 | 6! | 720 |
7 | 7! | 5040 |
Warto zwrócić uwagę na dwa szczególne przypadki:
0! = 1
oraz:
1! = 1
Zwłaszcza 0! może początkowo wydawać się zaskakujące, ponieważ nie wykonujemy tutaj żadnego mnożenia. W matematyce przyjmuje się jednak, że silnia z zera wynosi 1. Jest to bardzo ważne również podczas tworzenia algorytmów.
Jak obliczyć silnię krok po kroku?
Załóżmy, że chcemy policzyć:
6!
Rozpisujemy wszystkie kolejne liczby:
6 × 5 × 4 × 3 × 2 × 1
Następnie wykonujemy mnożenie:
W programowaniu nie chcemy jednak ręcznie zapisywać działania osobno dla każdej liczby. Potrzebujemy algorytmu, który będzie działał zarówno dla 3, 5, 10, jak i każdej innej poprawnej wartości.
Do tego możemy wykorzystać pętlę.
Silnia w Pythonie - rozwiązanie z pętlą for
Jednym z najprostszych sposobów obliczania silni w Pythonie jest zastosowanie pętli for.
def silnia(n):
wynik = 1
for i in range(1, n + 1):
wynik *= i
return wynik
print(silnia(5))Program zwróci: 120.
Jak działa ten kod?
Ustawiamy wynik = 1, bo mnożenie od zera zawsze dawałoby zero. Następnie pętla przechodzi przez liczby od 1 do n i aktualizuje wynik.
Zapis wynik *= i oznacza wynik = wynik * i.
Silnia w Pythonie z użyciem pętli while
Ten sam problem możemy rozwiązać za pomocą pętli while.
def silnia(n):
wynik = 1
i = 1
while i <= n:
wynik *= i
i += 1
return wynik
print(silnia(5))Wynik ponownie wynosi: 120.
Pętla działa tak długo, jak i <= n, a po każdym wykonaniu zwiększamy i o jeden.
Silnia w Pythonie - rozwiązanie rekurencyjne
Silnia jest jednym z najpopularniejszych przykładów wykorzystywanych podczas nauki rekurencji.
def silnia(n):
if n == 0:
return 1
return n * silnia(n - 1)
print(silnia(5))Wynik: 120. Warunek n == 0 jest przypadkiem bazowym, który zatrzymuje kolejne wywołania funkcji.
Jak działa rekurencyjne obliczanie silni?
Prześledźmy działanie programu dla silnia(5):
Po osiągnięciu przypadku bazowego funkcja wraca przez kolejne wywołania i oblicza wynik.
Jeżeli chcesz lepiej zrozumieć ten mechanizm, warto przeczytać również artykuł dotyczący rekurencji w Pythonie.
Silnia w C++ - przykład z pętlą
W języku C++ możemy wykorzystać dokładnie tę samą logikę.
#include <iostream>
using namespace std;
long long silnia(int n) {
long long wynik = 1;
for (int i = 1; i <= n; i++) {
wynik *= i;
}
return wynik;
}
int main() {
cout << silnia(5);
return 0;
}Program wyświetli: 120.
Zaczynamy od wartości 1, wykonujemy pętlę od 1 do n, mnożymy aktualny wynik przez kolejną liczbę i na końcu zwracamy wynik.
Silnia w C++ - wersja rekurencyjna
Możemy również wykorzystać rekurencję:
#include <iostream>
using namespace std;
long long silnia(int n) {
if (n == 0) {
return 1;
}
return n * silnia(n - 1);
}
int main() {
cout << silnia(5);
return 0;
}Przypadkiem bazowym jest if (n == 0) { return 1; }. Bez tego warunku funkcja wywoływałaby samą siebie bez końca.
Pętla czy rekurencja - jak lepiej liczyć silnię?
Oba rozwiązania są poprawne, ale działają w nieco inny sposób.
Rozwiązanie iteracyjne wykorzystuje pętlę:
for
lub:
while
Rozwiązanie rekurencyjne wykorzystuje funkcję wywołującą samą siebie.
Dla prostego obliczania silni rozwiązanie z pętlą jest zazwyczaj bardziej praktyczne. Zużywa mniej pamięci i jest bardzo czytelne.
Rekurencyjna wersja jest natomiast świetnym ćwiczeniem podczas nauki:
- funkcji,
- rekurencji,
- przypadków bazowych,
- stosu wywołań,
- analizowania algorytmów.
Dlatego silnia bardzo często pojawia się w zadaniach edukacyjnych.
Silnia liczby 0 - dlaczego 0! = 1?
To pytanie pojawia się bardzo często.
Na początku intuicyjne może wydawać się:
0! = 0
ale poprawna wartość to:
0! = 1
Możemy zauważyć zależność:
1! = 1 × 0!
Wiemy jednocześnie, że:
1! = 1
więc:
1 = 1 × 0!
Stąd:
0! = 1
Taka definicja jest także potrzebna w wielu wzorach matematycznych, szczególnie związanych z kombinatoryką.
Jak obliczyć silnię w Pythonie za pomocą gotowej funkcji?
Python posiada również gotową funkcję obliczającą silnię w module math.
import math
print(math.factorial(5))Wynik: 120. Zanim sięgniesz po math.factorial, naucz się napisać ten algorytm samodzielnie: w zadaniach maturalnych polecenie potrafi ograniczyć, z jakich gotowych funkcji wolno korzystać.
Co się stanie dla liczby ujemnej?
Silnia w podstawowej definicji dotyczy liczb naturalnych. Dobrze napisana funkcja powinna odrzucić liczbę ujemną.
def silnia(n):
if n < 0:
raise ValueError("Silnia nie jest zdefiniowana dla liczb ujemnych")
wynik = 1
for i in range(1, n + 1):
wynik *= i
return wynikDzięki temu program zgłosi błąd zamiast liczyć coś bez sensu. Funkcja nie powinna zwracać raz liczby, a raz tekstu: kod, który ją wywołuje, nie wiedziałby, czego się spodziewać.
Dlaczego silnia rośnie tak szybko?
Spójrzmy na kilka wartości:
5! = 120
10! = 3 628 800
15! = 1 307 674 368 000
20! = 2 432 902 008 176 640 000
Każda kolejna silnia powstaje poprzez pomnożenie poprzedniego wyniku przez następną liczbę:
10! = 10 × 9!
Dlatego wartości zwiększają się bardzo szybko.
Ma to również znaczenie w programowaniu.
W C++ trzeba zwracać uwagę na zakres typu danych. Zwykły int bardzo szybko przestanie wystarczać do przechowywania wyniku. Nawet long long ma ograniczony zakres.
Python radzi sobie pod tym względem wygodniej, ponieważ potrafi obsługiwać bardzo duże liczby całkowite bez konieczności ręcznego wybierania większego typu.
Gdzie wykorzystuje się silnię?
Silnia pojawia się przede wszystkim w matematyce i kombinatoryce, ale jest również bardzo dobrym ćwiczeniem programistycznym.
Możesz spotkać ją przy:
- obliczaniu permutacji,
- obliczaniu kombinacji,
- rachunku prawdopodobieństwa,
- analizie algorytmów,
- zadaniach rekurencyjnych,
- nauce funkcji i pętli.
Przykładowo liczba sposobów ustawienia pięciu różnych osób w jednym rzędzie wynosi:
5! = 120
Czyli pięć osób możemy ustawić na 120 różnych sposobów.
Najczęstsze błędy podczas obliczania silni
Silnia jest prostym algorytmem, ale początkujący programiści często popełniają kilka charakterystycznych błędów.
1. Ustawienie wyniku na 0
wynik = 0wynik = 12. Pominięcie ostatniej liczby
Użyj range(1, n + 1), a nie range(1, n) – w przeciwnym razie liczba n nie zostanie uwzględniona.
3. Brak przypadku bazowego
if n == 0:
return 1Program powinien również poprawnie obsługiwać przypadek 0! = 1.
Zadanie - napisz własny program obliczający silnię
Spróbuj napisać program, który pobiera liczbę, sprawdza, czy nie jest ujemna, oblicza silnię i wyświetla wynik.
Przykładowe działanie: Podaj liczbę: 6 → 6! = 720.
W Pythonie rozwiązanie może wyglądać tak:
n = int(input("Podaj liczbę: "))
if n < 0:
print("Silnia nie jest zdefiniowana dla liczb ujemnych.")
else:
wynik = 1
for i in range(1, n + 1):
wynik *= i
print(f"{n}! = {wynik}")Jeżeli potrafisz samodzielnie napisać taki program i wyjaśnić każdą jego linię, podstawowy algorytm obliczania silni masz już dobrze opanowany.
Silnia na maturze i podczas nauki programowania
Zadania związane z silnią pozwalają sprawdzić znacznie więcej niż znajomość jednego wzoru matematycznego. Wymagają zrozumienia pętli, funkcji, mnożenia kolejnych wartości, przypadków brzegowych, a w wersji rekurencyjnej również działania stosu wywołań.
Przed maturą radzę sprawdzić, czy potrafisz:
- wyjaśnić, czym jest silnia,
- obliczyć ją ręcznie,
- napisać rozwiązanie z pętlą,
- napisać rozwiązanie rekurencyjne,
- przeanalizować kod krok po kroku,
- wskazać przypadek bazowy,
- obsłużyć wartość 0,
- zauważyć błędy w gotowym algorytmie.
Silnię z pseudokodem, czyli w formie, jakiej możesz użyć w arkuszu, znajdziesz w encyklopedii Prymo: silnia – pseudokod i Python. Co dokładnie obowiązuje na egzaminie, opisuję w przewodniku po maturze z informatyki rozszerzonej.
Jeśli chcesz przećwiczyć silnię i inne algorytmy pod maturę z nauczycielem, zapraszam na korepetycje z informatyki. Uczą u nas ludzie, którzy sami zdali tę maturę, a na lekcjach pracujemy nad tym, co sprawia Ci trudność: Pythonem, C++, algorytmami czy SQL.
Silnia - co warto zapamiętać?
Silnia liczby n to iloczyn wszystkich liczb naturalnych od 1 do n. Zapisujemy ją jako n!, a szczególnym przypadkiem jest 0!, które zawsze wynosi 1.
Silnię można obliczać zarówno iteracyjnie za pomocą pętli, jak i rekurencyjnie. Na początku nauki radzę poznać oba rozwiązania, ponieważ każde z nich rozwija inne umiejętności programistyczne.
Najważniejsze zależności to:
0! = 1
1! = 1
n! = n × (n – 1)!
Jeżeli rozumiesz, skąd bierze się ostatnia zależność, potrafisz prześledzić kolejne wartości zmiennej w pętli i umiesz samodzielnie napisać funkcję obliczającą silnię, możesz spokojnie przejść do kolejnych zagadnień z algorytmiki.



