Рекурсивная функция - сократить время, затраченное на вычисления - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Условия задачи: Пусть x1=x2=x3=1; xi=xi-1+xi-3, i=4,5... Код функции:
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); 
}
Проблема в том, что при вычислении например x50 значения функции вычисляются многократно, что очень сильно влияет на скорость вычисления значения. Вопрос в том, как можно сохранить переменные значения функции, чтобы они не вычислялись каждый раз заново.

Решение задачи: «Рекурсивная функция - сократить время, затраченное на вычисления»

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];
}

Объяснение кода листинга программы

  1. Статический массив values инициализируется значениями 1, 1, 1.
  2. Статическое значение next_idx инициализируется значением 3.
  3. Переменная idx инициализируется значением i - 1.
  4. Если idx больше или равен next_idx, то выполняется следующее:
    • Значение values[idx] вычисляется как сумма двух предыдущих вызовов функции xn_rec, с аргументами i - 1 и i - 3.
    • Значение next_idx обновляется значением i.
  5. Возвращается значение values[idx].

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.818 из 5
Похожие ответы