Реализовать функцию рекурсией

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

Помогите реализовать это уравнение рекурсивной функцией:

(A[i-20]*(A[i-19]*(A[i-18]*...*(A[i-1]+B[i-1])+B[i-2])+B[i-3])+...+B[i-20])

Ответы

▲ 3Принят

Вот итеративное решение:

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);

(Есть ли более простое решение с хвостовой рекурсией?)