#include // Calculul lui e dupa dezvoltarea e = 1 + 1/1! + 1/2! + ... + 1/n! // pana cand termenul curent nu depaseste o valoare data (1e-6) // functia pentru calculul unui termen; printf evidentiaza apelarea double t(unsigned n) { printf("am apelat t(%u)\n", n); return n == 0 ? 1.0 : t(n-1)/n; } // varianta ineficienta, recalculeaza termenul de fiecare data double lim2(unsigned n, double s_n_1) { return t(n) > 1e-6 ? lim2(n+1, s_n_1+t(n)) : s_n_1; } // varianta cu 3 parametri, inclusiv termenul curent, folosit // in calcularea recursiva a termenului urmator double lim3(unsigned n, double s_n_1, double t_n) { return t_n > 1e-6 ? lim3(n+1, s_n_1+t_n, t_n/(n+1)) : s_n_1; } // varianta iterativa, acelasi calcul ca si in lim3 // parametrii devin variabile, actualizate la fiecare iteratie double lim_iter(void) { unsigned n = 0; double s = 0, t = 1.0; while (t > 1e-6) { s += t; n++; t /= n; } return s; } int main(void) { printf("%f\n", lim2(0, 0)); printf("%f\n", lim3(0, 0, 1)); printf("%f\n", lim_iter()); return 0; }