Реализуйте рекурсивный алгоритм вычисления суммы n первых членов ряда

Рейтинг: 1Ответов: 2Опубликовано: 22.03.2023

Реализуйте рекурсивный алгоритм вычисления суммы n первых членов ряда. Вычисление факториала и возведение в степень для каждого члена ряда нельзя использовать.

1+(x/1!)+(x^2/2!)+(x^3/3!)+...+(x^n/n!)

double recursive_f(double n, double x)
{
    if (n == 1)
    {

    }
    else
    {
            
    }

    return s;              
}

Вообще не понимаю как... Я могу только рекурсивно вычислить факториал. Нужно рекурсивно (через цикл я и сам могу) вычислить сумму, при этом вычисление факториала и возведение в степень для каждого члена ряда нельзя использовать.

Ответы

▲ 1

Если под суммой, например, трёх первых членов ряда имеется в виду со включением третьей степени: 1+(x/1!)+(x^2/2!)+(x^3/3!), то

def req(x, n, current = 1, p = 1):
    if p > n:
        return current
    else:
        return current + req(x, n, current * x / p, p + 1)

print(req(0.5, 3))

Код на Питоне, шарп негде проверить сейчас, но перевести легко

▲ 0

Вариант с использованием ref параметра для возврата суммы, основная функция вычисляет и возвращает x^n/n!:

public static double Calc(double x, int n) {
    double s = 0;
    Calc(x, n, ref s);
    Console.WriteLine($"Calc ({x}, {n}) -> {s}");
    return s;
}

public static double Calc(double x, int n, ref double s) {
    if (n == 0) {
        s = 1;
        return 1;
    }
    double p = x/n * Calc(x, n - 1, ref s);
    s += p;
    return p;
}

Тест:

Calc(1, 0);
Calc(1, 1);
Calc(6, 4);
Calc (1, 0) -> 1
Calc (1, 1) -> 2
Calc (6, 4) -> 115

Если же переписать обычное итерационное решение:

public static double Iter(double x, int n) {
    double sum = 1;
    double p = 1;
    for (int i = 1; i <= n; i++) {
        p *= x / i;
        sum += p;
    }
    return sum;
}

в "прямом" порядке, то получится аналог ответа @MBo:

static double Rec(double x, int n, double sum = 1, int i = 1) {
    return i > n ? sum : sum + Rec(x, n, sum * x / i, i + 1);
}