Как вычислить явную форму рекурсивной функции? - PullRequest
15 голосов
/ 23 апреля 2011

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

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, что привело к явной форме рекурсивной формулы, но я не могу вспомнить

Ответы [ 3 ]

12 голосов
/ 29 мая 2012
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
5 голосов
/ 20 июля 2012

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

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

  1. если ваше повторение является линейным (или полиномиальным), wikihow содержит пошаговые инструкции (с GF и без)
  2. если вы хотите прочитать что-то о GF, перейдите на эту вики , но я не получил ее, пока не начал делать примеры (см. Далее)
  3. Пример использования GF по Фибоначчи
  4. если предыдущий пример не имеет смысла, скачайте GF book и прочитайте самый простой пример GF (раздел 1.1, то есть a [n + 1] = 2 a [n] +1, затем 1.2 , a [n + 1] = 2 a [n] +1, затем 1,3 - Фибоначчи)
  5. (пока я в теме книги) templatetypedef упомянул конкретную математику, скачайте здесь , но я не знаю много об этом, за исключением того, что в нем есть повторение, суммы и глава GF (среди прочих) ) и таблица простых GF на стр. 335
  6. Когда я углубился в нелинейные вещи, я увидел эту страницу , используя которую я потерпел неудачу при подходе z-преобразований и не пробовал линейную алгебру, но ссылка на рациональное разностное выражение была лучшей ( см. следующий шаг)
  7. так, согласно этой странице , рациональные функции хороши тем, что вы можете преобразовать их в полиномы и использовать линейные методы из шагов 1. 3. и 4. выше, которые я выписал вручную и, вероятно, сделал какая-то ошибка, потому что (см. 8)
  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)}}. Поэтому я вернусь и поищу ошибки в ручных вычислениях (они полезны для понимания того, как работает весь процесс преобразования).

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

2 голосов
/ 24 апреля 2011

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

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

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

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

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

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

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.

...