Программа возвращает некорректное значение из рекурсии. Как можно решить этот трабл?
Суть программа следующая: Она должна вывести значение гиперболического синуса от x и посчитать прогрессию через рекурсию,которая выглядит так:x+x^3/3!+x^5/5!+x^7/7!+x^9/9!.......Рекурсия считается пока член прогрессии больше 0.001. Мой код выглядит следующим образом:
#include <iostream>
#include<cmath>
using namespace std;
int factorio(int n)
{
switch (n)
{
case 0:return 0;
break;
case 1:return 1;
break;
default:
return n * factorio(n - 1);
break;
}
}
double beg(double progress, double x, double x1, int i1)
{
if (x1 <= 0.001)
return progress;
else
{
progress += x1;
x1 = pow(x, 2 * i1 + 1) / factorio(2 * i1 + 1);
i1 += 1;
return progress + beg(progress, x, x1, i1);
}
}
int main()
{
double x = 1.7, progress = 0, x1 = x;
int i1 = 1;
cout<<sinh(x)<<endl;
cout << beg(progress,x,x1,i1);
}
Я пробовал различные методы написания функции beg,но там всегда выходит значение, которое гораздо больше того, что должно получаться. Сейчас sh(x)=2.6,а функция beg возвращает значение 12.146,хотя должно было вернуть примерно такое же. P.S.Я смотрел, как работает функция через отладчик,и она считает всё нормально до определенного места: Она у фигурной скобки, которая закрывает функцию, возвращается к строчке ### return progress + beg(progress, x, x1, i1); ### и выполняет её несколько раз, в результате возвращается не 2.6 ,как должно быть, а результат побольше. Есть способ это зафиксить?
Ответы (1 шт):
return beg(progress, x, x1, i1);
Иначе у вас происходит удвоение текущего значения.
А вообще вам нужна рекурсия? В данном случае с ней сложнее код и дольше считается.
Заметьте, что каждое слагаемое получается из предыдущего умножением на x^2 и делением на 2i*(2i+1). Это можно использовать и с рекурсией.