#include <stdio.h>
#include <math.h>

double finite_product(int a, int b) {
    double product = 1.0;
    for (int k = a; k <= b; k++) {
        product *= (1.0 + 1.0 / k);
    }
    return product;
}

double infinite_product_recursive(int k, double product, double eps, int max_iter, int *used) {
    if (*used >= max_iter) {
        return product; // Защита от бесконечной рекурсии
    }

    product *= (1.0 + 1.0 / k);
    (*used)++;

    // Проверка условия выхода
    if (fabs(1.0 / k) < eps) {
        return product;
    }

    return infinite_product_recursive(k + 1, product, eps, max_iter, used);
}

int main(void) {
    int a = 2, b = 31;
    double eps = 1e-6;

    double fin = finite_product(a, b);
    printf("Конечное произведение (k=%d..%d): %.12f\n", a, b, fin);

    int used = 0;
    int max_iter = 1000000; // Защита от бесконечной рекурсии
    double inf_prod = infinite_product_recursive(a, 1.0, eps, max_iter, &used);
    printf("Приближенное бесконечное произведение (eps=%.1e): %.12f\n", eps, inf_prod);
    printf("Использовано членов: %d (начиная с k=%d)\n", used, a);

    return 0;
}
