Silnia liczby n to wynik mnożenia po kolei wszystkich liczb od 1 do n. Prosto, z animacją.
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.
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.
Naciśnij „Krok", aby pomnożyć przez kolejną liczbę, albo „Auto".
funkcja silnia(n): wynik ← 1 dla i od 2 do n: wynik ← wynik * i zwróć wynik
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#include <iostream>
using namespace std;
long long silnia(int n) { // long long, bo wynik szybko robi się duży
long long wynik = 1;
for (int i = 2; i <= n; i++) {
wynik *= i; // dokładamy kolejną liczbę do mnożenia
}
return wynik;
}
int main() {
cout << silnia(5) << endl; // Wynik: 120
cout << silnia(0) << endl; // Wynik: 1
cout << silnia(10) << endl; // Wynik: 3628800
}To skrót. Zamiast pisać „pomnóż przez siebie wszystkie liczby od 1 do 5", piszemy po prostu 5!. Wynik to 120.
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.
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ę.
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.
Policz w pamięci i wpisz wynik, a potem kliknij Sprawdź.
3! = , 4! = , a 5! = . Pamiętaj też, że 0! = .
Uzupełnij tabelę:
| n | n! |
|---|---|
| 2 | |
| 4 | |
| 6 |
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.
Do tego hasła nie mamy jeszcze przypisanych pojedynczych zadań. Cały spis zadań maturalnych z tego działu jest tutaj:
Zagadnienia z tego samego obszaru matury – warto je powtórzyć razem: