Silnia
Silnia (oznaczana jako n!) jest to iloczyn kolejnych liczb naturalnych od 1 do n. Jest to pojęcie czysto matematyczne, jednak często spotykane w zadaniach informatycznych oraz na maturze. Obliczanie silni można wykonać na wiele sposób. Przy zadaniach z silnią należy zwrócić uwagę na optymalizację. Źle napisany program nie będzie wydajny i będzie miał dużą złożoność czasową.
Kod w C++ (iteracyjny)
W podejściu iteracyjnym tworzymy pętle, która mnoży licznik przez samego siebie tyle razy, ile użytkownik wpisze z klawiatury:
#include <iostream> #include <cstdlib> using namespace std; int main() { int liczba; long long silnia = 1; cout << "podaj liczbe" << endl; cin >> liczba; for (int i = 1; i<=liczba;i++) { silnia *= i; } cout << silnia << endl; system("PAUSE"); return(0); }
Kod w C++ (rekurencyjny)
W podejściu rekurencyjnym potrzebna jest dodatkowa funkcja, która będzie rekurencyjnie wywoływać samą siebie. Z każdym wywołaniem funkcji pomniejszamy argument. Momentem zatrzymania wykonania programu jest sytuacja, gdy przekazany argument jest równy 1.
#include <iostream> #include <cstdlib> using namespace std; int silnia (int liczba) { if (liczba < 2) { return liczba; } return liczba * silnia(liczba - 1); } int main() { int liczba; cout << "podaj liczbe" << endl; cin >> liczba; cout << silnia(liczba) << endl; system("PAUSE"); return(0); }
Komentarze
Rekurencja zawiera drobny błąd. Prosze policzyć silnię z 0.
Z definicji wynika, że silnia z 0 (0! = 1)
tak więc if (liczba<2) return liczba; (raczej return 1)
Czy się mylę?
Świetny artykuł 🙂 Polecam
Za pomocą long long możemy uzyskać silnię z mniejszej liczby niż za pomocą unsigned long long co wciąż jest za małe aby obliczyć silnie ze 100 :C. Mój komputer dał radę dojść do silni z 65 (wynik nie był dobry ale jeszcze nie wywalało 0 ), a na pewno można by pobawić się w obliczanie silni ze 100 może jakaś klasa wykorzystująca tablice czy coś
Silnia 0 == 1
wiec ja bym napisal tak
int sil(int n)
{
return (n <= 0) ? 1 : n * sil(n-1);
//jak poda ujemna to bedzie 1 co nei jest prawda ale ujdzie chyba
}
Bardzo świetne artykuły. Świetne do nauki podstaw z programowania w C++ .