Obliczanie Silni
Silnia w matematyce operuje na zbiorze liczb naturalnych i oznacza iloczyn wszystkich liczb.
Oznaczana jest poprzez wykrzyknik ! tj. n!
Funkcję tę można zapisać wzorem rekurencyjnym:
Przykładowo zapis 6! oznacza 6 · 5 · 4 · 3 · 2 · 1 = 720
Najprostsza implementacja silni w C# polega na wykorzystaniu rekurencji.
private static long silnia(int n)
{
if (n == 0)
{
return 1;
}
else
{
return n * silnia(n - 1);
}
}
- Dla podanego argumentu n zwróć n!
- Ze względu na fakt, że wartości silni bardzo szybko są duże to do przechowywania wartości używany jest typ zmiennej long
- Zaczynamy od sprawdzenia warunku czy n równa się 0
- jeśli tak zwracamy 1
- w przeciwnym wypadku rekurencyjnie pobieramy kolejne czynniki.
Rozwiązanie rekurencyjne jest eleganckie ale można je skrócić do zaledwie jednej linijki używając skróconej instrukcji if.
private static long silnia(int n)
{
return n == 0 ? 1 : n * silnia(n - 1);
}
Należy jednak pamiętać, że przy każdym wywołaniu jest tworzona kopia zmiennej n.
Co oznacza, że do obliczenia n! zostanie utworzonych n kopii zmiennej co oczywiście niepotrzebnie zwiększa zapotrzebowanie programu na pamięć komputera.
Dlatego w tym wypadku lepszym rozwiązaniem będzie rozwiązanie iteracyjne:
private static long silnia(int n)
{
long result = n;
while (--n > 0)
{
result *= n;
}
return result;
}
- deklarujemy zmienną wynikową result i przypisujemy jej wartość n.
- następnie w pętli mnożymy result przez n – 1
- czyli dla n = 6 będzie 6 · 5 · 4 · 3 · 2 · 1 = 720
- i zwracamy wynik result.
I teraz sprawdzamy nasze rozwiązania.
static void Main(string[] args)
{
// Silnia
Console.WriteLine(silnia(6));
}
Świetny artykuł! Zawsze warto poznać nowe sposoby rozwiązywania problemów w programowaniu.
Podoba mi się, jak dbasz o każdy szczegół. To sprawia, że czytanie Twoich artykułów jest przyjemnością.