Программа возвращает некорректное значение из рекурсии. Как можно решить этот трабл?

Суть программа следующая: Она должна вывести значение гиперболического синуса от 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 шт):

Автор решения: MBo
return beg(progress, x, x1, i1);

Иначе у вас происходит удвоение текущего значения.

А вообще вам нужна рекурсия? В данном случае с ней сложнее код и дольше считается.

Заметьте, что каждое слагаемое получается из предыдущего умножением на x^2 и делением на 2i*(2i+1). Это можно использовать и с рекурсией.

→ Ссылка