Рекурсия возвращает одно и тоже число

мне нужно было написать код, вычисляющий число 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 шт):

Автор решения: Harry

Вы считаете неоптимально, это раз - совсем не надо считать до 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 членов...

→ Ссылка