如何计算递归函数的显式形式?

时间:2011-04-23 18:25:02

标签: recursion formula explicit

我有这个递归函数:

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

我想知道是否有办法证明这一点。我google了一下,但没有找到任何简单的理解。我已经知道生成函数可能解决了它,它们太复杂了,我宁愿不进入它们。我正在寻找一种更简单的方法。

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 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:5)

好的,我知道你不想生成函数(GF从现在开始)和所有复杂的东西,但我的问题结果是非线性的,简单的线性方法似乎不起作用。经过一整天的搜索,我找到了答案,希望这些发现对其他人有所帮助。

我的问题:a [n + 1] = a [n] /(1 + a [n])(即非线性(也不是多项式),但也不是完全非线性 - 它是一个有理差分方程)

  1. 如果您的重复是线性的(或多项式),wikihow有逐步说明(有和没有GF)
  2. 如果你想阅读有关GF的内容,请转到this wiki,但在我开始做示例之前我没有得到它(见下文)
  3. 关于斐波纳契的
  4. GF usage example
  5. 如果上一个例子没有意义,请下载GF book并阅读最简单的GF示例(第1.1节,即a [n + 1] = 2 a [n] +1,然后是1.2,a [ n + 1] = 2 a [n] +1,然后1.3 - Fibonacci)
  6. (虽然我在书的主题上)templatetypedef提到具体数学,下载here,但我不太了解它,除了它有一个重复,总和和GF章节(以及其他)和第335页的简单GF表格
  7. 当我深入研究非线性的东西时,我看到了this page,使用了我在z变换方法中失败并且没有尝试线性代数,但是理性差异eqn的链接是最好的(见下一步) )
  8. 所以按照this page,有理函数是很好的,因为你可以将它们转换为多项式并使用上面步骤1的线性方法.3。和4.我手工写出并可能犯了一些错误,因为(见8)
  9. Mathematica(甚至免费的WolframAlpha)都有一个递归求解器,RSolve[{a[n + 1] == a[n]/(1 + a[n]), a[1] == A}, a[n], n]让我得到一个简单的{{a[n] -> A/(1 - A + A n)}}。所以我想我会回去查找手工计算中的错误(它们有助于理解整个转换过程的工作原理)。
  10. 无论如何,希望这有帮助。

答案 2 :(得分:2)

通常,没有用于将递归形式转换为迭代形式的算法。这个问题是不可判定的。例如,考虑这个递归函数定义,它定义了Collat​​z序列:

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'< 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。