Grade 10 · RecursionCitește în română
Recursive GCD
Original: Cmmdc recursiv
The idea
Euclid's algorithm written recursively: gcd(a, 0) = a, and gcd(a, b) = gcd(b, a % b). The recursive call is the last operation in the function (tail recursion), so nothing is left to compute on the way back. We also print the number of calls, to see how quickly a remainder of 0 is reached.
Original description (Romanian)
Algoritmul lui Euclid scris recursiv: cmmdc(a, 0) = a, iar cmmdc(a, b) = cmmdc(b, a % b). Autoapelul este ultima operație din funcție (recursivitate „de coadă”), deci nu mai rămâne nimic de calculat la întoarcere. Afișăm și numărul de apeluri, ca să vedem cât de repede se ajunge la rest 0.
Examples
Input
48 18
Expected output
6 4
Input
7 0
Expected output
7 1
The code
Comments are in Romanian, as in the original collection. Edit freely: you can reset at any time.
/*
* Titlu: Cmmdc recursiv
* Clasa: 10
* Capitol: Recursivitate
* Descriere: Algoritmul lui Euclid scris recursiv: cmmdc(a, 0) = a, iar
* cmmdc(a, b) = cmmdc(b, a % b). Autoapelul este ultima operație din
* funcție (recursivitate „de coadă”), deci nu mai rămâne nimic de calculat
* la întoarcere. Afișăm și numărul de apeluri, ca să vedem cât de repede
* se ajunge la rest 0.
* Complexitate: O(log(min(a, b)))
*
* Exemplu
* Intrare: 48 18
* Ieșire: 6 4
*
* Exemplu
* Intrare: 7 0
* Ieșire: 7 1
*/
#include <iostream>
using namespace std;
int apeluri;
long long cmmdc(long long a, long long b)
{
apeluri++;
if (b == 0)
return a;
return cmmdc(b, a % b);
}
int main()
{
long long a, b;
cin >> a >> b;
long long d = cmmdc(a, b);
cout << d << ' ' << apeluri << '\n';
return 0;
}
Runs on a real g++ (C++17, -O2) through Compiler Explorer. Keep runs short; there's a time limit.