Реализовать функцию рекурсией
Помогите реализовать это уравнение рекурсивной функцией:
(A[i-20]*(A[i-19]*(A[i-18]*...*(A[i-1]+B[i-1])+B[i-2])+B[i-3])+...+B[i-20])
Источник: Stack Overflow на русском
Помогите реализовать это уравнение рекурсивной функцией:
(A[i-20]*(A[i-19]*(A[i-18]*...*(A[i-1]+B[i-1])+B[i-2])+B[i-3])+...+B[i-20])
Вот итеративное решение:
result = 1;
for (int j = 1; j <= 20; j++)
result = result * A[i - j] + B[i - j];
Рекурсия не нужна, чтобы не забивать стек понапрасну.
Для разминки, вот вам рекурсивное решение:
double GetResultRec(size_t minidx, size_t maxidx)
{
if (minidx > maxidx) return 1.0;
return A[minidx] * GetResultRec(minidx + 1, maxidx) + B[minidx];
}
double result = GetResultRec(i - 20, i - 1);
А вот рекурсивное, явно поддерживающее хвостовую рекурсию:
double GetResultTailRec(size_t minidx, size_t maxidx, double factor, double addend)
{
if (minidx > maxidx) return factor + addend;
return GetResultTailRec(
minidx + 1, maxidx,
factor * A[minidx],
addend * factor + B[minidx]);
}
double result = GetResultTailRec(i - 20, i - 1, 1.0, 0.0);
(Есть ли более простое решение с хвостовой рекурсией?)