4.  Рекурсия и итерация: факториел; редица на Фибоначи; най-голям общ делител; най-малко общо кратно

**  Най-голям общ делител [1.2.3]
* Алгоритъм на Евклид за намиране на най-голям общ делител
 // gcd.cpp
#include <iostream>
using namespace std;

unsigned gcd1(unsigned a, unsigned b)
{ unsigned swap;
  while (b > 0) { swap = b; b = a%b; a = swap; }
  return a;
}

unsigned gcd2(unsigned a, unsigned b)
{ return (0 == b) ? a : gcd2(b, a%b); }

int main()
{ const unsigned a = 1, b = 125;
  cout << gcd1(a, b) << endl;
  cout << gcd2(a, b) << endl;
  return 0;
}
* Да се напише метода само с изваждане.


**  Връщане от рекурсия и използване на променливите [1.2.5]
* Рекурсивно отпечатване на цифрите на число
// digit2.cpp
#include <iostream>
using std::cout;

void printN(unsigned n)
{ if (n >= 10) printN(n/10);
  cout << n%10;;
}
int main()
{ unsigned m = 1234;
  printN(m);
  return 0;
}

* Пресмятане на n! и изследване на ефективността на реализациите [1.2.5]

/* Два варианта за пресмятане на n! [1.2.5] */
// fact.cpp
#include <iostream>

unsigned long fact1(unsigned i)
{ if (1 == i) return 1;
  return i * fact1(i - 1);
}

unsigned i;
unsigned long fact2()
{
    if (1 == i) return 1;

        return i-- * fact2(); // --i*fact();
}

const unsigned n = 6;
int main()
{
  std::cout << "fact1: " << n << "! = " << fact1(n) << endl;
 
i=n; // i=n+1;
  std::cout << "fact2: " << n << "! = " << fact2(n) << endl;
  return 0;
}

** Рекурсия и използване на глобални променливи [1.2.5]
* За дадено естествено число n (n < 9) да се отпечатат в нарастващ и намаляващ ред числата 10k
(0 < k < n).
// print0.cpp
#include  <iostream>
using std::cout;
using std::cin;
using std::endl;

const unsigned n = 6; 

void printRed1(unsigned k, unsigned long res)
{ cout << res << " ";
  if (k < n) printRed1(k + 1, res*10);
  cout << res << " ";
}

unsigned k = 0;
void printRed2(unsigned long res)
{  k++;
  cout << res << " ";
  if (k < n) printRed2(res*10);
  cout << res << " ";
}

unsigned long res = 1;
void printRed3()
{  k++;
  res *= 10;
  cout << res << " ";
  if (k < n) printRed3();
  cout << res << " ";
  res /= 10;
}

int main()

{
 printRed1(1,10);   cout << endl;
 printRed2(10);      cout << endl;
 k = 0;
 printRed3();          cout << endl;
 return 0;
}


Редица на Фибоначи

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...