递推和递归_递推关系总结

引子

著名的 Hanoi 问题是这样描述的:[1]

汉诺塔(港台: 河内塔)是根据一个传说形成的数学问题:
有三根杆子
杆上有
个 (
) 穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至
杆:

每次只能移动一个圆盘;
大盘不能叠在小盘上面。
提示:可将圆盘临时置于
杆,也可将从
杆移出的圆盘重新移回
杆,但都必须遵循上述两条规则。

问:如何移?最少要移动多少次?

344430e928862114dcaea5ce7ad226d6.png
Hanoi问题图示

f6b24171d451fad9e9e1212b5759ae59.png
八块圆盘的Hanoi玩具

解:

个圆盘需要从
搬到
柱所需的最小次数。整个搬运过程可以分为三个阶段
  1. 将上面的
    个盘从
    移动到
  2. 将最下面的第
    个盘从
    移动到
  3. 个盘从
    移动到

那么就有下面的等式成立

这个等式的意思就是:

个圆盘从
移动到
的次数=
个盘从
移动到
次数+ 第
个盘移动到
次数+
个盘从
移动到
次数

个圆盘从
移动到
的次数=

个盘从
移动到
次数=

个盘从
移动到
次数=

个盘移动到
次数=

也不难理解,如果只有一个盘子,那么我直接

即可,即

这就是一个递归式出现了

这个递归式求出来了,那么怎么求解呢?

还有一个著名的斐波那契数[2]

根据高德纳(Donald Ervin Knuth)的《计算机程序设计艺术》( The Art of Computer Programming),1150年印度数学家Gopala和金月在研究箱子包装对象长宽刚好为1和2的可行方法数目时,首先描述这个数列。在西方,最先研究这个数列的人是比萨的列奥那多(意大利人斐波那契Leonardo Fibonacci),他描述兔子生长的数目时用上了这数列:

c72723c99ebfa55b7331ac2325943fbc.png
兔子的数量就是斐波那契数
第一个月初有一对刚诞生的兔子
第二个月之后(第三个月初)它们可以生育
每月每对可生育的兔子会诞生下一对新兔子
兔子永不死去
假设在
月有兔子总共
对,
月总共有
对。在
月必定总共有
对:因为在
月的时候,前一月(
月)的b对兔子可以存留至第
月(在当月属于新诞生的兔子尚不能生育)。而新生育出的兔子对数等于所有在
月就已存在的
对。

这个问题可以来画个表[3]

9f220baef64444c981d1443bbec8e10b.png
兔子数量变化

最终可以得到递推式:

这个递推关系又怎么求解呢?

这就是接下来要说的东西了。

常系数线性齐次递推关系的求解

  • 定义

是给定的正整数,若数列
的相邻
项之间满足关系

成立。
  1. ,则称该关系为
    阶线性递推关系。
  2. 若满足1的情况下,还满足
    都是常数,则成之为为
    阶常系数线性递推关系。
  3. 若满足1,2的情况下,还满足
    ,则称其为
    阶常系数齐次线性递推关系。

这个定义和微分方程的定义十分类似,只不过把导数的阶次换成了递推的阶次。

  • 例子
  1. 求解斐波那契数列递推式的解

    列特征方程:
    ,求解得到

    递归方程的通解为

    带入边界条件
    ,得到线性方程组

    求解得到

    这个也就是在邓俊辉版的数据结构[4]第25页推导出来的结果。
  2. 求解递推关系

    列特征方程
    ,求解得到

    递归方程的通解为

    带入边界条件
    ,得到线性方程组

    求解得到
  3. 求解

    对于这个方程,要先把它化成一个变量的递推方程,由递推式可知
    ,所以有下列关于
    的递推式:

    这个求解就跟之前的一模一样了。
    列特征方程:
    ,根为

    递归方程的通解为:

    根据边界条件列出线性方程组:
  • 求解总结

对于常系数线性齐次递推方程

的求解步骤如下
  1. 列出特征方程:
    ,设求解的解为
  2. 写出带系数的通项公式:
  3. 代入边界条件,或者叫递归基,得到一个关于
    的线性方程组,要想有唯一解要求边界条件的数目和幂次一致,这个原因学过线性代数肯定是没有问题的

证明过程可以参考组合数学引论[5],写的比较清楚。

其实证明过程也可以参考微分方程的求解,两个的求解方式有很多的相似之处。

常系数非齐次递推关系的求解1-利用已知的解形式

  • 定义

前面看了常系数齐次递归,知道了齐次是因为

,那么
就是非齐次了。

非齐次通常是没有普遍的解法的。

书上会给一些关于特殊的

的解的形式,但是记忆起来比较麻烦,很容易记错,推荐碰到非齐次的时候考虑使用生成函数来解题。生成函数的作用比记忆这些特殊解的构造要有用的多。

对于非齐次线性递推方程写 2 个例子。

  • 例子

求解 Hanoi 递推式

代表通解,
代表通解。

对于其对应的齐次线性递归式列特征方程:

计算特解:

,对应着有
这样形式的解的
,将
代入特征多项式,得到
(这个特征多项式就是前面的特征方程的去掉0的一个函数)。根据书上
[5]的特解形式的对应,

cedf0e0364a79b47834fe2868e42d6ef.png

对应的特解形式为

,所以特解为
,这里可以看出来,
的取值和
无关,所以
,将其带入递推方程

因此,特解为

,综合非齐次特解和齐次通解可知

,代入边界条件,有

,所以,递推关系为

  • 总结
  1. 求解非齐次递推关系的解的时候,要先求解出对应的齐次方程带系数的通解
  2. 观察非齐次项
    的表达式是否是特殊的表达式,如果是,根据已知的特解的表达形式得到带系数的特解
  3. 将带系数的特解直接带入递推关系,代入边界条件得到特解的系数,得到不带系数的特解
  4. 将带系数的通解和特解相加
    带入原来的递推表达式中,根据边界条件求出解的系数,这时候去掉系数的解就是递推表达式的解。

常系数非齐次递推关系的求解2-使用生成函数

如果不知道生成函数(或者母函数)是什么,应该先补一下这方面的知识。

  • 例子

还是来求解前面的 Hanoi 问题

  • 总结

先写到这儿,有空有人看了再往下面写。


分析递归

  • 程序实现
  • 复杂度分析

递归与迭代的转化

  • 关系
  • 转化方法

参考

  1. ^Hanoi问题维基百科 https://zh.wikipedia.org/wiki/%E6%B1%89%E8%AF%BA%E5%A1%94
  2. ^Fibonacci https://zh.wikipedia.org/wiki/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97
  3. ^陈景润.组合数学 https://book.douban.com/subject/10808577/
  4. ^邓俊辉.数据结构 https://book.douban.com/subject/25859528/
  5. ^ab组合数学引论 https://book.douban.com/subject/4867855/
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值