Silnia

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));
}

2 comments

  1. Świetny artykuł! Zawsze warto poznać nowe sposoby rozwiązywania problemów w programowaniu.

  2. Podoba mi się, jak dbasz o każdy szczegół. To sprawia, że czytanie Twoich artykułów jest przyjemnością.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *