【问题标题】:How to calculate the explicit form of a recursive function?如何计算递归函数的显式形式?
【发布时间】:2011-08-11 14:01:18
【问题描述】:

我有这个递归函数:

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

【问题讨论】:

  • 不容易。斐波那契封闭式公式需要线性代数来计算,但有一个代数证明。这不容易...

标签: recursion formula explicit


【解决方案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]) (即不是线性的(也不是多项式),但也不是完全非线性的——它是一个有理差分方程)

    1. 如果您的递归是线性的(或多项式),wikihow 有分步说明(有和没有 GF)
    2. 如果您想阅读有关 GF 的内容,请转至 this wiki,但直到我开始做示例时才明白(见下)
    3. GF usage example 斐波那契
    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提到了具体数学,下载here,但我不太了解它,除了它有一个递归、求和、GF章节(以及其他)和一个表格第 335 页上的简单 GFs
    6. 当我深入研究非线性事物时,我看到了this page,使用它我在 z 变换方法中失败并且没有尝试线性代数,但是到有理差 eqn 的链接是最好的(见下一步)
    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)}}。所以我想我会回去寻找手工计算中的错误(它们有助于理解整个转换过程是如何工作的)。

    无论如何,希望这会有所帮助。

    【讨论】:

    • 感谢分享,有用的链接。
    【解决方案3】:

    一般来说,没有将递归形式转换为迭代形式的算法。这个问题是无解的。例如,考虑这个递归函数定义,它定义了 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'

    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,但归纳和证明我的猜测并不是我想要的。在这种特殊情况下,我猜到了答案,但我正在寻找一种数学方法来找到它。但是,我希望它尽可能简单(?)。
    猜你喜欢
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    相关资源
    最近更新 更多