Faktoriál
1. Faktorial
1.2. C#
Načtení čísla, pro které bude následně ve statické hlavní metodě vypočten faktoriál, je realizováno pomocí příkazu (metody s výstupními parametry) TryParse. V hlavní statické metodě jsou pomocí jednotlivých výpisů odděleny hodnoty faktoriálu vypočtené pomocí volaných metod s celočíselným návratem, jejichž těla obsahují různé typy cyklu - viz Kód 1. Tyto celočíselné návraty (datového typu long) jsou konvertovány pomocí příkazu ToString vyvolaného pomocí tečkové notace. Datový typ long umožňuje větší rozsah celočíselných hodnot (horní mez až 9,223,372,036,854,775,807). Tím umožníme uživateli zadávat i větší čísla, pro které má být vypočten faktoriál (horní mez datového typu int je 2,147,483,647), aniž bychom způsobili přetečení. Např. 12! = 479,001,600 a faktoriál čísla 13 je již 13! = 6,227,020,800.
Číslice jsou formátovány pomocí formátu "N0", což znamená, že jsou to celá čísla bez desetinných míst ("N" ... Number, "0" ... počet vypsaných desetinných míst).
static void Main(string[] args) { // Výpis textu Console.WriteLine("Výpočet faktoriálu"); // Výzva k zadání čísla pro výpočet faktoriálu Console.Write("Zadejte číslo: "); /* Načtení čísla - 'n' ... číslo, pro které bude vypočten * faktoriál (výstupní parametr TryParse) */ int.TryParse(Console.ReadLine(), out int n); /* Výpis textu a hodnoty faktoriálu, který je výstupem zavolané funkce * s předaným parametrem 'n'; specifikace výstupního formátu * čísla "N0", tj. bez čísel za desetinnou čárkou */ Console.WriteLine("Faktoriál (cyklus while): " + FaktorialWhile(n).ToString("N0")); Console.WriteLine("Faktoriál (cyklus do-while): " + FaktorialDoWhile(n).ToString("N0")); Console.WriteLine("Faktoriál (cyklus for): " + FaktorialFor(n).ToString("N0")); Console.WriteLine("Faktoriál (rekurze): " + FaktorialVolaniRekurze(n).ToString("N0")); // Čekání na stisk klávesy -> ukončení programu Console.ReadKey(); }
Kód 1: Program Faktorial - deklarace hlavní statické metody Main
První volanou metodou pro výpočet faktoriálu pomocí cyklu s podmínkou na začátku je metoda s celočíselným návratem (datový typ long) FaktorialWhile - viz Kód 2. V této metodě jsou použity dvě lokální proměnné i a f. Proměnná i představuje čítač cyklu, ale zároveň představuje aktuální číslo v součinu. Tato proměnná je datového typu int, protože není zapotřebí velký rozsah zadávaných čísel vzhledem k horní mezi datového typu long vybraného pro proměnnou f, která představuje hodnotu vypočteného faktoriálu. Výraz f = f * i; bychom mohli zkrátit pomocí zápisu f *= i; . Dále jsme také zkrátili zápis inkrementace i = i + 1; na i++.
// Metoda s celočíselným návratem (datový typ long) pro výpočet faktoriálu pomocí cyklu while static long FaktorialWhile(int n) { /* Deklarace: 'i' ... čítač (aktuální číslo v součinu); * 'f' ... hodnota faktoriálu */ int i; long f; // Inicializace i = 1; f = 1; // Opakuj, pokud je čítač menší, nebo roven číslu pro výpočet faktoriálu while (i <= n) { // Výpočet faktoriálu f = f * i; // Inkrementace čítače i++; } // Návrat vypočtené hodnoty faktoriálu return f; }
Kód 2: Deklarace statické metody s celočíselným návratem s názvem FaktorialWhile
Další volanou metodu pro výpočet faktoriálu pomocí cyklu s podmínkou na konci je metoda s celočíselným návratem FaktorialDoWhile - viz Kód 3.
// Metoda s celočíselným návratem pro výpočet faktoriálu pomocí cyklu do-while static long FaktorialDoWhile(int n) { /* Deklarace: 'i' ... čítač (aktuální číslo v součinu); * 'f' ... hodnota faktoriálu */ int i; long f; // Inicializace i = 1; f = 1; do { // Výpočet faktoriálu f = f * i; // Inkrementace čítače i++; } // Opakuj, dokud je čítač menší, nebo roven číslu pro výpočet faktoriálu while (i <= n); // Návrat vypočtené hodnoty faktoriálu return f; }
Kód 3: Deklarace statické metody s celočíselným návratem s názvem FaktorialDoWhile
Poslední typem cyklu, použitým při výpočtu faktoriálu, je cyklus s krokem, který je využit v metodě FaktorialFor - viz Kód 4. Na rozdíl od předchozích metod je řídící proměnná deklarována a inicializována přímo v cyklu for.
// Metoda s celočíselným návratem pro výpočet faktoriálu pomocí cyklu for static long FaktorialFor(int n) { // Deklarace: 'f' ... hodnota faktoriálu long f; // Inicializace f = 1; // Cyklus s krokem; deklarace: 'i' ... čítač (aktuální číslo v součinu) for (int i = 1; i <= n; i++) { // Výpočet faktoriálu f = f * i; } // Návrat vypočtené hodnoty faktoriálu return f; }
Kód 4: Deklarace statické metody s celočíselným návratem s názvem FaktorialFor
Metoda s celočíselným návratem pro výpočet faktoriálu pomocí volání funkce využívající rekurzi je metoda FaktorialVolaniRekurze - viz Kód 5. V této metodě je volána rekurzivní metoda FaktorialRekurze.
/* Metoda s celočíselným návratem pro výpočet faktoriálu pomocí * volání funkce využívající rekurzi */ static long FaktorialVolaniRekurze(int n) { /* Návrat vypočtené hodnoty faktoriálu pomocí * volání metody pro výpočet faktoriálu pomocí rekurze */ return FaktorialRekurze(n); }
Kód 5: Deklarace statické metody s celočíselným návratem s názvem FaktorialVolaniRekurze
Metoda FaktorialRekurze využívá principu rekurze, kde metoda volá sama sebe (tím se postupně zanořuje sama do sebe) - viz Kód 6. Při každém takovém zanořování je předán parametr o hodnotu o 1 menší než v předchozím volání. V metodě tedy musí být definována podmínka, kdy je toto vnořování zastaveno, tj. n == 0. Až tato podmínka bude vyhodnocena jako true, nastane postupné předávání vypočtené hodnoty faktoriálu zpět do volajících metod. Tento cyklus postupného předávání zpět probíhá tak dlouho, dokud neobdržíme výsledek příkazu, který odstartoval volání vnořených metod.
// Metoda s celočíselným návratem pro výpočet faktoriálu pomocí rekurze static long FaktorialRekurze(int n) { // Deklarace: 'f' ... hodnota faktoriálu long f; // Pokud je předaná hodnota v parametru rovna nule if (n == 0) { // Faktoriál je 1 f = 1; } else { // Rekurzivní volání metody(metoda volá sama sebe) f = n * FaktorialRekurze(n - 1); } // Přiřazení návratu metody return f; }
Kód 6: Deklarace statické rekurzivní metody s celočíselným návratem s názvem FaktorialRekurze