Wszystkie zagadnienia: Algorytmy
podstawowy silniarekurencjamatura podstawowa z informatyki

Silnia (n!)

Silnia liczby n to wynik mnożenia po kolei wszystkich liczb od 1 do n. Prosto, z animacją.

01

Opis

Silnia liczby n to wynik pomnożenia przez siebie wszystkich liczb od 1 do n. Zapisujemy ją znakiem wykrzyknika: n!. Na przykład 5! to 1 · 2 · 3 · 4 · 5, czyli 120.

Jak to policzyć? Zaczynamy od 1. Potem mnożymy ten wynik przez 2, potem przez 3 i tak dalej, aż dojdziemy do n. Za każdym razem wynik robi się większy. To wszystko – żadnej magii.

Jeden wyjątek do zapamiętania: 0! to 1. Tak po prostu jest umówione i tak trzeba to policzyć w programie.

Dwa sposoby zapisania. Można w pętli (mnożymy po kolei, jak wyżej) albo „przez samą siebie": n! to n razy (n-1)!. To drugie nazywamy rekurencją – funkcja wywołuje samą siebie dla mniejszej liczby, aż dojdzie do 0. Na start łatwiej i bezpieczniej użyć pętli.

Na maturze: silnia to typowa rozgrzewka z pętli i z rekurencji. Pojawia się też, gdy trzeba policzyć, na ile sposobów można coś ustawić w kolejności.

Wizualizacja

Prześledź krok po kroku, jak liczymy n!: startujemy od 1, a potem mnożymy wynik przez kolejne liczby 1, 2, …, n. Podświetlony kafel to liczba, przez którą właśnie mnożymy. Zobacz, jak szybko iloczyn puchnie.

12345
wynik (n!)1

Naciśnij „Krok", aby pomnożyć przez kolejną liczbę, albo „Auto".

02

Pseudokod

funkcja silnia(n):
  wynik ← 1

  dla i od 2 do n:
    wynik ← wynik * i

  zwróć wynik
03

Implementacja w Pythonie i C++

def silnia(n):
    """Liczy n! (czyli 1 * 2 * ... * n). Dla n = 0 daje 1."""
    wynik = 1
    for i in range(2, n + 1):
        wynik *= i          # dokładamy kolejną liczbę do mnożenia
    return wynik


# To samo, ale funkcja woła samą siebie (rekurencja)
def silnia_rek(n):
    if n == 0:              # najmniejszy przypadek: 0! = 1
        return 1
    return n * silnia_rek(n - 1)


# Przyklady uzycia
print(silnia(5))       # Wynik: 120
print(silnia(0))       # Wynik: 1
print(silnia_rek(6))   # Wynik: 720
04

Najczęściej zadawane pytania

Czym jest zapis `n!`?

To skrót. Zamiast pisać „pomnóż przez siebie wszystkie liczby od 1 do 5", piszemy po prostu 5!. Wynik to 120.

Ile wynosi `0!`?

0! = 1. Tak jest umówione i tak trzeba to obsłużyć w programie – inaczej pętla „od 1 do 0" nic by nie policzyła.

Lepiej liczyć silnię pętlą czy rekurencją?

Wynik jest ten sam. Pętla jest prostsza i pewniejsza, zwłaszcza dla dużych liczb. Rekurencja (funkcja wołająca samą siebie) ładniej wygląda, ale przy bardzo dużym n może się „zapchać". Na start wybierz pętlę.

Dlaczego program czasem pokazuje dziwny wynik silni?

Bo liczba zrobiła się za duża i nie zmieściła się w zmiennej. Wtedy wynik potrafi wyjść ujemny albo bez sensu. To nie błąd w Twoim myśleniu – po prostu liczba jest ogromna. Python liczy takie duże liczby bez problemu.

05

Ćwiczenie

Policz w pamięci i wpisz wynik, a potem kliknij Sprawdź.

3! = , 4! = , a 5! = . Pamiętaj też, że 0! = .

Uzupełnij tabelę:

nn!
2
4
6

Złożoność obliczeniowa

Liczba kroków rośnie tak jak n – żeby policzyć n!, robimy jedno mnożenie dla każdej liczby od 1 do n. To zapisujemy jako O(n). Dodatkowej pamięci prawie nie zużywamy (O(1)) – wystarczy jedno miejsce na wynik.

Przećwicz w zadaniach maturalnych

Do tego hasła nie mamy jeszcze przypisanych pojedynczych zadań. Cały spis zadań maturalnych z tego działu jest tutaj:

Zadania z działu: Programowanie

↗

Powiązane zagadnienia