Рекурсия

Пример:
Разгледаме триъгълни форми (числа):
[]
[][]
[][][]
n-тото триъгълно число е лицето на триъгълник с ширина n (предполагаме, че всяко [] има лице 1). От картинката - третото триъгълно число е 6.

    int area(int side)
    {
        if (1 == side) return 1;
        int smaller_area = area(side - 1);
        return smaller_area + side;
    }


Пример:
Алгоритъм на Евклид за намиране на най-голям общ делител
 

// gcd.c

#include <stdio.h>

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;
 
    printf("%d \n", gcd1(a, b)); 
    printf("%d \n", gcd1(a, b));
    return 0; 
}


Връщане от рекурсия и използване на променливите
Пример:
Рекурсивно отпечатване на цифрите на число 

// digit2.c
#include <stdio.h>

void printN(unsigned n) 
{
    if (n >= 10) printN(n/10);
 
      printf("%d \n", n%10); 
} 
int main() 
{
    unsigned m = 1234;
 
    printN(m); 
    return 0; 
} 

Пример:
Пресмятане на n!

// fact.c
#include <stdio.h>

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

unsigned long fact2(unsigned n)
{
    unsigned i = 1;
    unsigned long res = 1;
    for (; i <= n; ++i)
        res *= i;
    return res;
}

const unsigned n = 6;

int main()
{
    printf("fact1: %u! = %lu \n", n, fact1(n));
    printf("fact2: %u! = %lu \n", n, fact2(n));
    return 0;
}


** Рекурсия и използване на глобални променливи
Пример:
За дадено естествено число n (n < 9) да се отпечатат в нарастващ и намаляващ ред числата 10k
 (0 < k < n). 

// print0.c
#include <stdio.h>

const unsigned n = 6;

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

unsigned k = 0;

void printRed2(unsigned long res)
{
    k++;
    printf("%lu \n", res);
    if (k < n) printRed2(res*10);
    printf("%lu \n", res);
}

unsigned long res = 1;

void printRed3()
{
    k++;
    res *= 10;
    printf("%lu \n", res);
    if (k < n) printRed3();
    printf("%lu \n", res);
    res /= 10;
}

int main()
{
    printRed1(1,10);
    printRed2(10);
    k = 0;
    printRed3();
    return 0;
}


** Ефективност на рекурсията