Как вычислить явный вид рекурсивной функции?

У меня есть эта рекурсивная функция:

f(n) = 2 * f(n-1) + 3 * f(n-2) + 4
f(1) = 2
f(2) = 8

Я знаю по опыту, что явная его форма:

f(n) = 3 ^ n - 1  // pow(3, n) - 1

Я хочу знать, есть ли способ доказать это. Я немного погуглил, но не нашел ничего простого для понимания. Я уже знаю, что функции генерации, вероятно, решают это, они слишком сложны, я бы предпочел не попасть в них. Я ищу более простой способ.

P.S. Если это поможет, я помню что-то вроде этого, решив это:

f(n) = 2 * f(n-1) + 3 * f(n-2) + 4
// consider f(n) = x ^ n
x ^ n = 2 * x ^ (n-1) + 3 * x ^ (n-2) + 4

И тогда вы каким-то образом вычислили x, которые приводят к явной форме рекурсивной формулы, но я не могу вспомнить

Ответы

Ответ 1

f(n) = 2 * f(n-1) + 3 * f(n-2) + 4
f(n+1) = 2 * f(n) + 3 * f(n-1) + 4

f(n+1)-f(n) = 2 * f(n) - 2 * f(n-1) + 3 * f(n-1) - 3 * f(n-2)
f(n+1) = 3 * f(n) + f(n-1) - 3 * f(n-2)

Теперь 4 ушел. Как вы сказали, следующий шаг позволяет f (n) = x ^ n

x^(n+1) = 3 * x^n + x^(n-1) - 3 * x^(n-2)

делим на x ^ (n-2)

x^3 = 3 * x^2 + x - 3
x^3 - 3 * x^2 - x + 3 = 0

чтобы найти x

(x-3)(x-1)(x+1) = 0
x = -1 or 1 or 3

f(n) = A * (-1)^n + B * 1^n + C * 3^n
f(n) = A * (-1)^n + B + C * 3^n

Теперь найдите A, B и C, используя значения, которые у вас есть

f(1) = 2; f(2) = 8; f(3) = 26

f(1) = 2 = -A + B + 3C
f(2) = 8 = A + B + 9C
f(3) = 26 = -A + B + 27C

решение для A, B и C:

f(3)-f(1) = 24 = 24C      => C = 1
f(2)-f(1) = 6 = 2A + 6    => A = 0
2 = B + 3                 => B = -1

Наконец

f(n) = 3^n - 1

Ответ 2

Хорошо, я знаю, что вы не хотели генерировать функции (GF с этого момента) и все сложные вещи, но моя проблема оказалась нелинейной и простые линейные методы, похоже, не работали. Поэтому после целого дня поиска я нашел ответ и, надеюсь, эти выводы помогут другим.

Моя проблема: a [n + 1] = a [n]/(1 + a [n]) (то есть не линейная (или многочлена)), но также не полностью нелинейная - это рациональное разностное уравнение)

  • Если ваш рекуррент является линейным (или полиномиальным), wikihow содержит пошаговые инструкции (с GF и без него)
  • Если вы хотите что-то прочитать о GF, перейдите в эту вики, но я не получил его, пока не начал делать примеры (см. следующая)
  • Пример использования GF на Фибоначчи
  • Если предыдущий пример не имеет смысла, загрузите книгу GF и прочитайте простейший пример GF (раздел 1.1, то есть [n + 1] = 2 a [n] +1, затем 1.2, a [n + 1] = 2 a [n] +1, затем 1.3 - Фибоначчи)
  • (пока я нахожусь в теме книги) templatetypedef, упомянутый Concrete Mathematics, загрузите здесь, но я мало знаю об этом, кроме он имеет повторение, суммы и главу GF (среди прочих) и таблицу простых GF на стр. 335
  • поскольку я глубже для нелинейного материала, я увидел эту страницу, используя которую я потерпел неудачу при подходе z-transforms и не попробовал линейный алгебра, но связь с рациональным разностным уравнением была лучшей (см. следующий шаг).
  • так как эта страница, рациональные функции хороши, потому что вы можете преобразовать их в полиномы и использовать линейные методы шага 1. 3. и 4. выше, которое я написал вручную и, вероятно, допустил некоторую ошибку, потому что (см. 8)
  • Mathematica (или даже бесплатный WolframAlpha) имеет рекурсивный решатель, который с RSolve[{a[n + 1] == a[n]/(1 + a[n]), a[1] == A}, a[n], n] получил мне простой {{a[n] -> A/(1 - A + A n)}}. Поэтому, я думаю, я вернусь и пойму ошибку в ручных вычислениях (они хороши для понимания того, как работает весь процесс преобразования).

В любом случае, надеюсь, что это поможет.

Ответ 3

В общем, нет алгоритма преобразования рекурсивной формы в итеративный. Эта проблема неразрешима. В качестве примера рассмотрим это определение рекурсивной функции, которое определяет последовательность Collatz:

f(1) = 0
f(2n) = 1 + f(n)
f(2n + 1) = 1 + f(6n + 4)

Неизвестно, является ли это даже четко определенной функцией или нет. Если бы существовал алгоритм, который мог бы преобразовать его в замкнутую форму, мы могли бы решить, правильно ли он определен.

Однако для многих распространенных случаев можно преобразовать рекурсивное определение в итеративный. Отличный учебник Concrete Mathematics проводит большую часть своих страниц, демонстрируя, как это сделать. Один общий метод, который работает достаточно хорошо, когда вы догадываетесь, что ответ заключается в использовании индукции. В качестве примера для вашего случая предположим, что вы считаете, что ваше рекурсивное определение действительно дает 3 ^ n - 1. Чтобы доказать это, попробуйте доказать, что он справедлив для базовых случаев, а затем покажите, что это знание позволяет обобщать решение вверх, Вы не поместили базовый случай в свой пост, но я предполагаю, что

f(0) = 0
f(1) = 2

Учитывая это, давайте посмотрим, правильна ли ваша догадка. Для конкретных входов 0 и 1 вы можете проверить путем проверки, что функция вычисляет 3 ^ n - 1. Для индуктивного шага предположим, что для всех n ' n, что f (n) = 3 ^ n - 1. Тогда мы имеем, что

f(n) = 2f(n - 1) + 3f(n - 2) + 4
     = 2 * (3^{n-1} - 1) + 3 * (3^{n-2} - 1) + 4
     = 2 * 3^{n-1} - 2 + 3^{n-1} - 3 + 4
     = 3 * 3^{n-1} - 5 + 4
     = 3^n - 1

Итак, мы только что доказали, что эта рекурсивная функция действительно порождает 3 ^ n - 1.