Clasa a X-a · RecursivitateRead in English

Factorial recursiv în C++

În engleză: Recursive factorial

O(n)C++1737 de linii2 exemple

Ideea

Definiția matematică este deja recursivă: 0! = 1 și n! = n * (n - 1)!. Funcția are o condiție de oprire (n == 0) și un autoapel pe o problemă mai mică (n - 1). Apelurile se pun pe stivă: fact(4) așteaptă fact(3), care așteaptă fact(2) și așa mai departe până la fact(0); la întoarcere se fac înmulțirile, în ordine inversă.

Descrierea în engleză

The mathematical definition is already recursive: 0! = 1 and n! = n * (n - 1)!. The function has a stopping condition (n == 0) and a recursive call on a smaller problem (n - 1). The calls are pushed on the stack: fact(4) waits for fact(3), which waits for fact(2), and so on down to fact(0); the multiplications happen on the way back, in reverse order.

Complexitate
O(n) timp și O(n) memorie pe stivă
Clasa
Clasa a X-a (Grade 10)

Exemple

Exemplul 1

Intrare

5

Ieșire așteptată

120
Exemplul 2

Intrare

0

Ieșire așteptată

1

Codul C++

Codul complet, cu comentarii în română. Îl poți modifica liber și îl poți reseta oricând.

factorial-recursiv.cpp
/*
 * Titlu: Factorial recursiv
 * Clasa: 10
 * Capitol: Recursivitate
 * Descriere: Definiția matematică este deja recursivă: 0! = 1 și n! = n * (n - 1)!.
 *            Funcția are o condiție de oprire (n == 0) și un autoapel pe o problemă
 *            mai mică (n - 1). Apelurile se pun pe stivă: fact(4) așteaptă fact(3),
 *            care așteaptă fact(2) și așa mai departe până la fact(0); la întoarcere
 *            se fac înmulțirile, în ordine inversă.
 * Complexitate: O(n) timp și O(n) memorie pe stivă
 *
 * Exemplu
 * Intrare: 5
 * Ieșire: 120
 *
 * Exemplu
 * Intrare: 0
 * Ieșire: 1
 */
#include <iostream>
using namespace std;

long long fact(int n)
{
    if (n == 0)
        return 1;              // condiția de oprire
    return n * fact(n - 1);    // autoapel pe o problemă mai mică
}

int main()
{
    int n;
    cin >> n;
    cout << fact(n) << '\n';
    return 0;
}

Rulează pe un g++ adevărat (C++17, -O2) prin Compiler Explorer. Programele trebuie să se termine repede: există o limită de timp.