Как вычислить явный вид рекурсивной функции?
У меня есть эта рекурсивная функция:
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.