Во-первых, я предполагаю, что полный исполняемый регистр вашего кода выглядит как
#include <iostream>
using namespace std;
double PI(int n, double y=2){
double sum = 0;
if (n==0){
return 3;
}else if (n % 2 != 0){
sum = (4/(y*(y+1)*(y+2)))+(PI (n - 1 ,y+2)) ;
}else{
sum= -(4/(y*(y+1)*(y+2)))+PI (n - 1,y+2) ;
}
return sum;
}
int main(int argc, const char * argv[]) {
double n = PI (2,2);
cout << n << endl;
}
Я полагаю, что вы пытаетесь вычислить число Пи по формуле
(pi - 3)/4 = \sum_{k = 1}^{\infty} (-1)^{k+1} / ((2k(2k+1)(2k+2)),
(гдездесь и в других местах я использую код LaTeX для представления математических вещей).Это хорошая формула, которая сходится довольно быстро, несмотря на свою простоту.Если бы вы использовали первые два слагаемых суммы, вы бы обнаружили, что
(pi - 3)/4 \approx 1/(2*3*4) - 1/(4*5*6) ==> pi \approx 3.13333,
, который вы указали в своем вопросе.
Чтобы увидеть, что не так, вы могли бы проследить черезВаш первый вызов функции с PI (2, 2).Это дает три условия.
- n = 2: 2% 2 == 0, поэтому первый член -
-4/(2*3*4) + PI(1, 4)
.Это неправильный знак. - n = 1: 1% 2 == 1, поэтому второе слагаемое -
4/(4*5*6)
, что также является неправильным знаком. - n = 0: n== 0, поэтому третий член равен 3, что является правильным знаком.
Итак, вы вычислили
3 - 4/(2*3*4) + 4/(4*5*6)
, и мы видим, что существует много ошибок знака.
Основная причина в том, что вы определяете знак на основе n
, но если вы изучите формулу, знак зависит от y
.Или, в частности, это зависит от того, является ли y/2
нечетным или четным (в вашей формулировке, где вы, очевидно, собираетесь предоставить только y
значения для вашей суммы).
Вам следует изменить y
и n
соответственно.Или вы можете признать, что нет причин разъединять их и использовать что-то вроде следующего кода.В этом коде n
представляет количество используемых терминов, и мы вычисляем y
соответственно.
#include <iostream>
using namespace std;
double updatedPI(int n)
{
int y = 2*n;
if (n == 0) { return 3; }
else if (n % 2 == 1)
{
return 4. / (y*(y + 1)*(y + 2)) + updatedPI(n-1);
}
else
{
return -4. / (y*(y + 1)*(y + 2)) + updatedPI(n-1);
}
}
int main() {
double n = updatedPI(3);
cout << n << endl;
}