Реализуйте рекурсивный алгоритм вычисления суммы n первых членов ряда
Реализуйте рекурсивный алгоритм вычисления суммы 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;
}
Вообще не понимаю как... Я могу только рекурсивно вычислить факториал. Нужно рекурсивно (через цикл я и сам могу) вычислить сумму, при этом вычисление факториала и возведение в степень для каждого члена ряда нельзя использовать.
Ответы (2 шт):
Если под суммой, например, трёх первых членов ряда имеется в виду со включением третьей степени: 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))
Код на Питоне, шарп негде проверить сейчас, но перевести легко
Вариант с использованием 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);
}