C++. Вычислить сумму ряда с заданной точностью. Рекурсия.

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
forevercom
Сообщения: 3
Зарегистрирован: 19 ноя 2017, 17:11

19 ноя 2017, 17:15

Посмотрите пожалуйста, в чем проблема?

Код: Выделить всё

/*Найти сумму ряда с точностью е , общий член которого равен
       an=ln(n!)/n^2. Точность считается достигнутой, если 
       следующий член последовательности меньше заданного е.*/

#include "stdafx.h"
#include <iostream>
#include <clocale>
#include <iomanip>
#include <cmath>
#include <math.h>

using namespace std;
long fact(int n);
double sum(int n, double eps, double an);

void main() 
{
	setlocale(LC_CTYPE, "rus");
	setlocale(0, "rus");
	double eps,n=1,i;
	cout << "Zadaite e: "; cin >> eps;
	cout << "Summa = " << sum(1, eps, 1) << "///////////" << fact(n) << endl;
	system("pause");
}

long fact(int n) 
{
	long k = 1;
	if (n > 1)
		for (int i = 2; i <= n; ++i)
			k *= i;
	return k;
}

double sum(int n, double eps, double an)
{

	an = (log(fact(n))) / pow(n, 2);
	if (an < eps) return 0;
	else return an + sum(n + 1, eps, an);

}
Слива
Сообщения: 133
Зарегистрирован: 19 мар 2016, 10:15

19 ноя 2017, 20:20

Первый член ряда равен 0, потому что n = 1 и, следовательно ln(1) = 0, зануляется первый член ряда и ряд вылетает в строке return 0 - в подпрограмме sum. А рекурсия обязательна здесь вообще, потому что ряд не так считается. while(an < eps) - пишется, типа, такой цикл и все-такое. И вообще в подпрограмме sum последний или 2 последних параметра можно легко убрать. :)
Последний параметр an ниначто не влияет, а средний eps - я бы сделал лучше глобальной переменной и как правило ее присваивают 1E-6, но можно и с консоли ввести. :)
Здесь первый член всегда будет равен нулю, поэтому нужно считать со 2 элемента ряда, т.е. от n = 2. Вы допустили простую и детскую ошибку. :D
Где автор темы? :D
Вот какая программа получилась. Числа там конечно огромные, поэтому сильно маленькую точность ставить не получается. :(

Код: Выделить всё

//---------------------------------------------------------------------------
#include <vcl>
#include <iostream>
#include <conio>
#include <iomanip>
#include <cmath>
#include <math>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
using namespace std;

/*Найти сумму ряда с точностью е, общий член которого равен
an=ln(n!)/n^2. Точность считается достигнутой, если
следующий член последовательности меньше заданного е.*/
long double fact(int n)
{
    int i;
    long double k = 1;
    if(n > 1)
        for(i = 2; i <= n; i++)
            k *= i;
    return k;
}

//Ваша функция sum здесь не используется
double sum(int n, double eps)
{
    double an = (log((long double)fact(n)))/pow((double)n, 2);

    if(an < eps)
      return 0;
    else
      return an + sum(n + 1, eps);

}

int main()
{
    long double eps = 5E-3, n = 2, xn, Summa = 0, f;
       
    do
    {
        f = fact(n);
        xn = logl(f)/powl(n, 2);
        Summa += xn;
        n++;
    }while(fabs(xn) > eps);
    cout << "\nSumma = " << Summa;

    getch();
    return 0;
}
Код написан в C++Builder 6.
Программа выдает результат: "Summa = 19.5869".
Ответить