Clasa a X-a · RecursivitateRead in English
Factorial recursiv în C++
În engleză: Recursive factorial
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)
- Capitol
- Recursivitate
Exemple
Intrare
5
Ieșire așteptată
120
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.
/*
* 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.