// El mismo cálculo con recursión y con un ciclo.
#include <stdio.h>

// Algoritmo de Euclides: la llamada recursiva es lo último que se hace.
static int gcd_recursive(int a, int b) {
    if (b == 0) {
        return a;
    }
    return gcd_recursive(b, a % b);
}

static int gcd_loop(int a, int b) {
    while (b != 0) {
        int next_b = a % b;
        a = b;
        b = next_b;
    }
    return a;
}

// Aquí queda trabajo pendiente después de la llamada: la suma.
static long long sum_recursive(int n) {
    if (n <= 0) {
        return 0;
    }
    return n + sum_recursive(n - 1);
}

// La misma suma con un acumulador: lo pendiente se hace antes de llamar.
static long long sum_accumulator(int n, long long total) {
    if (n <= 0) {
        return total;
    }
    return sum_accumulator(n - 1, total + n);
}

static long long sum_loop(int n) {
    long long total = 0;
    while (n > 0) {
        total = total + n;
        n = n - 1;
    }
    return total;
}

int main(void) {
    printf("mcd(252, 105): %d y %d\n", gcd_recursive(252, 105), gcd_loop(252, 105));
    printf("suma hasta 100: %lld, %lld y %lld\n", sum_recursive(100),
           sum_accumulator(100, 0), sum_loop(100));
    return 0;
}
