Рекурсивная функция - сократить время, затраченное на вычисления - 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]
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д