0

Всем привет. Я вроде бы понимаю что такое рекурсия, но данную задачу решить не могу. Задание

Я подсмотрел в интернете примерный код на такую задачу, но он не подходит.

#include <iostream>
#include <cmath>

using namespace std;

int main() { setlocale(LC_ALL, "ru"); double x, E = 0.001, summ = 0.0; int n = 0; cout << "Введите -1 < x < 1: "; cin >> x;

double formula = (pow(x, 2 * n + 1)) / (2 * n + 1);

while (formula &gt;= E)
{
    if (n % 2 == 0)
    {
        summ += formula;
    }

    else
    {
        summ -= formula;
    }

    n += 1;

    formula = (pow(x, 2 * n + 1)) / (2 * n + 1);
}

n += 1;

cout &lt;&lt; &quot;Число членов ряда: &quot; &lt;&lt; n &lt;&lt; endl;
cout &lt;&lt; &quot;Сумма бесконечного ряда с точность 0.001: &quot; &lt;&lt; summ;

}

Надеюсь на скорейшую помощь, а самое главное - объяснение решения данной задачи:)

Harry
  • 221,325
  • Напишите свой код, а не ищите в Интернете. Посмотрите, сколько вопросов на эти темы здесь разобрано — неужели вам не хочется разобраться самому, как это работает?... – Harry Oct 06 '23 at 14:00
  • @Harry Я пытался сам разобраться. Либо я тупой, либо хз. Я просто не понимаю данной задачи по крайней мере. А по поводу того "сколько вопросов разобрано" - коды к этим задачам не особо понятны. Объяснения к этим кодам тоже максимально непонятные. – fanat skiLLa1 Oct 06 '23 at 14:11
  • Главная проблема заключается в том, что есть -1^n степени. И с ним я не понимаю что можно сделать, т.к. из - за него на 2 шаге при n = 1 formula становится отрицательной, поэтому цикл завершается. Я не могу понять, как можно это решить – fanat skiLLa1 Oct 06 '23 at 14:33
  • в математике есть такая вещь, как абсолютное значение. Оно же модуль. – Эникейщик Oct 06 '23 at 14:39
  • Я исправил решение, и теперь оно рабочее. Я понял, что от меня хотят. Но проблема в том, что это по факту не рекурсия и не функция. А как это перенести в подпрограмму и сделать через рекурсию, хз – fanat skiLLa1 Oct 06 '23 at 14:49
  • Рекурсивная или реккурентная? – Stanislav Volodarskiy Oct 06 '23 at 15:13
  • @StanislavVolodarskiy рекурсивный. Функция вызывает функцию и т.д. – fanat skiLLa1 Oct 06 '23 at 15:52
  • А то я вообще не понимаю, как сделать данную задачу с помощью рекурсии – fanat skiLLa1 Oct 06 '23 at 16:18
  • Как переделать цикл (любой цикл) в рекурсию вы понимаете? – Stanislav Volodarskiy Oct 06 '23 at 16:26
  • @StanislavVolodarskiy Лишь примерно. Я в рекурсии вообще не особо разбираюсь. Делал факториал числа через рекурсию, не более. – fanat skiLLa1 Oct 06 '23 at 16:31

1 Answers1

2

Ну вот вариант с рекурсией. Не лучший, далеко не самый эффективный, но — с рекурсией :)

double arctg(double x, double eps = 1e-10, int n = 0)
{
    double t = pow(x,2*n+1)/(2*n+1)*(1-2*(n%2));
    if (abs(t) > eps) return arctg(x,eps,n+1) + t;
    else return t;
}
Harry
  • 221,325
  • Блин, да когда же вы все запомните - функция pow(x,y) является крайне медленной и не предназначена для взятия целочисленных степеней. – Ddd Oct 06 '23 at 17:06
  • @Ddd Да когда ж вы научитесь читать? :) *далеко не самый эффективный* Мне надо было показать человеку рекурсию. Ну, а если хотите обтечь — https://ru.stackoverflow.com/a/1143442/195342 – Harry Oct 06 '23 at 17:53
  • @Harry Спасибо большое! Я сделал по вашему примеру, и всё заработало. Как я понял, рекурсия работает следующим образом:

    Вычисляется значение t по формуле. Наша функция помещается в низ стека. После чего мы возвращаем нашу функцию с изменённой n. Наша новая функция помещается в стек. В конце концов условие становится ложным, функция возвращает t и на этом всё обрывается?

    – fanat skiLLa1 Oct 08 '23 at 08:29
  • Ну, примерно так :) — мне словами объяснить сложно, но вроде верно :) – Harry Oct 08 '23 at 08:59