Ten warunek stopu strasznie komplikuje sprawę. Najłatwiej byłoby ustalić z góry ilość wywołań i zrobić to klasycznie.
double oblicz_pi(int n) {
if (n == 0)
return 2.0;
double i = (double)n;
double mult = i * i/(i-1) / (i + 1);
return mult * oblicz_pi(n-2);
}
Aby zachować warunek stopu wykombinowałem coś takiego:
#include <iostream>
#include <math.h>
void oblicz_pi(double *pi, int n, double eps) {
double i = (double)n;
double mult = i * i/(i-1) / (i + 1);
double nast = *pi * mult;
double diff = abs(*pi-nast);
*pi = nast;
if (diff<eps) {
return;
}
oblicz_pi(pi, n+2, eps);
}
int main() {
double pi = 2.0;
oblicz_pi(&pi, 2, 0.0000001);
std::cout << pi << std::endl;
return 0;
}