На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Нужна помощь , Программа на С++
    Программа должна вычислять значение функции arth(x) действительного аргумента |x|<1 с точностью ε с использованием рекурсии.
    Нашел вот этот код, но он не работает.

    ExpandedWrap disabled
      #include <stdio.h>
      #include <math.h>
      #define N       30
      double Arth(double x)
      {
        double arth=x;
        double a=x;
        for (int i=1;i<N;i++)
        {
          a *= x*x;
          arth += a/(2*i+1);
        }
        return arth;
      }
      void main(void)
      {
        printf("Exact arth(0.4621171)=0.5, this arth(0.4621171)=%g.",Arth(0.4621171));
      }
    Сообщение отредактировано: Qraizer -
      Вообще-то он работает ;) (я только изменил int main)

      Только код нерекурсивный и не учитывает точность - итерации должны останавливаться, когда очередное слагаемое становится меньше заданной точности.
      Стоит отладиться на итеративном коде, изменив цикл. а затем уже делать рекурсию.
      Сообщение отредактировано: MBo -
        Можете подправить или исправить код?
          Уже ничего не надо, я написал программу:
          ExpandedWrap disabled
            #include <iostream>
            #include <math.h>
            using namespace std;
             
             
            int main()
            {
                float e;
                double sum = 0, a = 1, x;
                int i = 0;
             
                cout << "e = ";
                cin >> e;
             
                cout << "X<1= " << endl;
                cin >> x;
             
                a = x;
                do
                {
                    sum += a;
                    a *= x*x*(2.0*i + 1.0) / (2.0*i + 3.0);
                    i++;
                } while (fabs(a) > e);
             
             
                cout << "arth(x) = " << sum << endl;
             
                system("pause");
                return 0;
            }
          Сообщение отредактировано: Qraizer -
            Так существенная же сторона задания - рекурсия - так и не выполнена! :no-sad:
              Ну если вы знаете как сделать через рекурсию, сделайте пожалуйста.
                Что-то вроде такого:

                ExpandedWrap disabled
                  double art(double x, double eps, double nom, double denom) {
                      double add = 0.0;
                      if (fabs(nom) > eps * denom)
                          add = art(x, eps, nom * x * x, denom + 2.0);
                      return nom / denom + add;
                  }  
                   
                  arth = art(x, eps, x, 1.0)
                Сообщение отредактировано: MBo -
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0294 ]   [ 16 queries used ]   [ Generated: 28.03.24, 14:50 GMT ]