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

Последний параметр an ниначто не влияет, а средний eps - я бы сделал лучше глобальной переменной и как правило ее присваивают 1E-6, но можно и с консоли ввести.

Здесь первый член всегда будет равен нулю, поэтому нужно считать со 2 элемента ряда, т.е. от n = 2. Вы допустили простую и детскую ошибку.

Где автор темы?

Вот какая программа получилась. Числа там конечно огромные, поэтому сильно маленькую точность ставить не получается.
Код: Выделить всё
//---------------------------------------------------------------------------
#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".