Korepetycje Informatyka

Silnia – co to jest i jak ją obliczyć? Python, C++ i przykłady

Minimalistyczna okładka artykułu o silni w Pythonie i C++

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:

6 × 5 = 30
30 × 4 = 120
120 × 3 = 360
360 × 2 = 720
720 × 1 = 720
6! = 720

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.

Python · pętla 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.

Dla n = 5: 1 → 2 → 6 → 24 → 120

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.

Python · pętla 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.

n! = n × (n – 1)!
Python · rekurencja
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):

silnia(5) → 5 × silnia(4)
→ 5 × 4 × silnia(3)
→ 5 × 4 × 3 × silnia(2)
→ 5 × 4 × 3 × 2 × silnia(1)
→ 5 × 4 × 3 × 2 × 1 × silnia(0)
silnia(0) = 1, więc wynik końcowy: 120

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ę.

C++ · pętla for
#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ę:

C++ · rekurencja
#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.

Python · moduł 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ą.

Python · walidacja danych
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 wynik

Dzię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

Niepoprawnie
wynik = 0
Poprawnie
wynik = 1

2. 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

Python · przypadek bazowy
if n == 0:
    return 1

Program 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:

Python · ćwiczenie
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.

Powiązane posty

Minimalistyczna okładka artykułu o rekurencji w Pythonie
Przygotowanie do matury
Szymon Leszkiewicz

Rekurencja – co to jest? Przykłady w Pythonie krok po kroku

Rekurencja to jedno z tych pojęć w programowaniu, które na początku może wydawać się skomplikowane. Funkcja wywołująca samą siebie? Brzmi jak sposób na stworzenie programu działającego w nieskończoność. W rzeczywistości rekurencja jest bardzo przydatną techniką, która pozwala rozwiązywać wiele problemów w prosty i czytelny sposób. W tym wpisie wyjaśniam, co to jest rekurencja, jak działa funkcja rekurencyjna oraz dlaczego tak ważny jest warunek zakończenia. Pokażę też kilka przykładów rekurencji w Pythonie – od prostego odliczania,

Czytaj więcej »
Studia po maturze z informatyki: jak wybrać kierunek i 3 alternatywy, gdy się nie dostałeś
Przygotowanie do matury
Szymon Leszkiewicz

Studia po maturze z informatyki: jak wybrać kierunek i 3 alternatywy, gdy się nie dostałeś

Masz przed sobą wyniki kwalifikacji i jedną z dwóch sytuacji. Albo dostałeś się na dwa kierunki i nie wiesz, który wybrać, albo nie dostałeś się na informatykę pierwszego wyboru i szukasz planu B. Ten wpis dotyczy obu sytuacji i jest przeznaczony dla Ciebie, jeśli decyzję o studiach podejmujesz właśnie teraz. Zacznę od rzeczy, którą powtarzam każdemu uczniowi podczas mentoringu dotyczącego wyboru studiów po maturze z informatyki: nazwa kierunku znaczy mniej, niż myślisz. Programy informatyki i

Czytaj więcej »

Umów pierwszą lekcję

Zostaw kontakt, oddzwonimy. Możesz też zadzwonić od razu – najszybciej ustalimy wszystko przez telefon.

Email

info@korepetycjeinformatyka.pl

Telefon

+48 884 699 256

Social Media - ZOBACZ CO WRZUCAMY!