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

16

我有这个递归函数:

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

我想知道有没有办法证明这一点。我谷歌了一下,但没有找到简单易懂的东西。我已经知道生成函数可能会解决它,但它们太复杂了,我不想深究它们。我正在寻找一个更简单的方法。

附言:如果有帮助的话,我记得有类似这样的解决方法:

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,导致递归公式的显式形式,但我记不太清楚了。


这并不容易。斐波那契闭合形式公式需要使用线性代数来计算,但有一个代数证明。这并不容易... - Blender
3个回答

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

5

好的,我知道您不想要生成函数(GF),以及所有复杂的内容,但我的问题是非线性的,简单的线性方法似乎不起作用。因此,在经过一整天的搜索后,我找到了答案,希望这些发现对其他人有所帮助。

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

  1. 如果您的递归是线性的(或多项式的),wikihow提供了逐步说明(带和不带GF)
  2. 如果您想阅读有关GF的内容,请转到this wiki,但在做例子之前我并没有理解它
  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. 当我深入研究非线性内容时,我看到了this page,使用它我在z变换方法上失败了,并且没有尝试线性代数,但有理差分方程的链接是最好的(请参见下一步)
  7. 因此根据this page,有理函数很好,因为您可以将它们转换为多项式并使用步骤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

通常情况下,将递归形式转换为迭代形式的算法不存在。这个问题是不可判定的。例如,考虑以下定义Collatz序列的递归函数:

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。


谢谢templatetypedef,但归纳和证明我的猜测并不是我想要的。在这种特殊情况下,我猜到了答案,但我正在寻找一种数学方法来找到它。然而,我希望它尽可能简单。 - atoMerz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接