Рекурсивная функция - сократить время, затраченное на вычисления - C (СИ)
Формулировка задачи:
Условия задачи:
Пусть x1=x2=x3=1; xi=xi-1+xi-3, i=4,5...
Код функции:
Проблема в том, что при вычислении например x50 значения функции вычисляются многократно, что очень сильно влияет на скорость вычисления значения. Вопрос в том, как можно сохранить переменные значения функции, чтобы они не вычислялись каждый раз заново.
int xn(int n)
{
if (n == 0) return 0;
if ((n == 1) || (n == 2) || (n == 3)) return 1;
return xn(n-1) + xn(n-3);
}Решение задачи: «Рекурсивная функция - сократить время, затраченное на вычисления»
textual
Листинг программы
size_t xn_rec(size_t i)
{
static size_t values[ITEM_CNT] = {1,1,1};
static size_t next_idx = 3;
size_t idx = i - 1;
if(idx >= next_idx)
{
values[idx] = xn_rec(i - 1) + xn_rec(i - 3);
next_idx = i;
}
return values[idx];
}
Объяснение кода листинга программы
- Статический массив
valuesинициализируется значениями 1, 1, 1. - Статическое значение
next_idxинициализируется значением 3. - Переменная
idxинициализируется значениемi - 1. - Если
idxбольше или равенnext_idx, то выполняется следующее:- Значение
values[idx]вычисляется как сумма двух предыдущих вызовов функцииxn_rec, с аргументамиi - 1иi - 3. - Значение
next_idxобновляется значениемi.
- Значение
- Возвращается значение
values[idx].