Рекурсия возвращает одно и тоже число
мне нужно было написать код, вычисляющий число e с помощью этой дроби:

Вот мой код:
#include <stdio.h>
#include <math.h>
double calcE(double);
double calc(int, double);
int main(int argc, char const *argv[])
{
int eps;
double res;
printf("Введите кол-во знаков после запятой: ");
scanf("%d",&eps);
res = calcE(eps);
printf("res = %.10f", res);
return 0;
}
double calcE(double eps)
{
if (!eps)
return 2;
double e = 1;
int count = 0;
eps = pow(10, eps);
e += 1 / calc(count, eps);
return e;
}
double calc(int count, double eps)
{
count++;
if (count == eps)
return count;
if (count % 2)
return count - (double)1 / calc(count, eps);
else
return count + (double)1 / calc(count, eps);
}
При вводе любого кол-ва знаков после запятой, выводится одно и тоже число, почему? На сколько я понял проблема в функции double calc(int count, double eps), она возвращает одно и тоже число. Но я не понимаю, что в ней не так.
Ответы (1 шт):
Вы считаете неоптимально, это раз - совсем не надо считать до 10n членов, чтоб получить точность n знаков, да и ваш способ не совсем хорош для таких вычислений (цепных дробей).
Но главная беда - что это - НЕ разложение числа e в непрерывную дробь. Вы считаете плохо, но верно.
Если хотите посчитать именно число e, то дробь для него -
При этом ваш код будет выглядеть так:
double calcE(double eps)
{
if (!eps)
return 2;
double e = 1;
int count = 1;
eps = pow(10, eps);
e += 1 / calc(count, eps);
return e;
}
double calc(int count, double eps)
{
if (count >= eps)
return count;
if (count % 2)
return count - 1 / calc(count+1, eps);
else
return 2 + 1 / calc(count+1, eps);
}
Только вот еще раз - даже при вводе 1 вы получите 8 верных знаков после запятой. Совсем не надо считать так много, как хотите делать вы. Попробуйте хотя бы сравнивать значения суммы для разных n и смотреть на их разность. Просто для 10 знаков вы уже вылетите за переполнение (да и время счета будет страшным), в то время как реально за глаза хватит счета где-то в 15 членов...
