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