引子
著名的 Hanoi 问题是这样描述的:[1]
汉诺塔(港台: 河内塔)是根据一个传说形成的数学问题:
有三根杆子。
杆上有
个 (
) 穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至
杆:
每次只能移动一个圆盘;
大盘不能叠在小盘上面。
提示:可将圆盘临时置于杆,也可将从
杆移出的圆盘重新移回
杆,但都必须遵循上述两条规则。
问:如何移?最少要移动多少次?
![344430e928862114dcaea5ce7ad226d6.png](https://i-blog.csdnimg.cn/blog_migrate/41123b235b02c887b575fac96415ad9f.jpeg)
![f6b24171d451fad9e9e1212b5759ae59.png](https://i-blog.csdnimg.cn/blog_migrate/ba56ec0d94c17ed8f7f56bf21f038306.jpeg)
解:
记
- 将上面的
个盘从
移动到
- 将最下面的第
个盘从
移动到
- 将
个盘从
移动到
那么就有下面的等式成立
这个等式的意思就是:
第
也不难理解,如果只有一个盘子,那么我直接
这就是一个递归式出现了
这个递归式求出来了,那么怎么求解呢?
还有一个著名的斐波那契数[2]
根据高德纳(Donald Ervin Knuth)的《计算机程序设计艺术》( The Art of Computer Programming),1150年印度数学家Gopala和金月在研究箱子包装对象长宽刚好为1和2的可行方法数目时,首先描述这个数列。在西方,最先研究这个数列的人是比萨的列奥那多(意大利人斐波那契Leonardo Fibonacci),他描述兔子生长的数目时用上了这数列:
![c72723c99ebfa55b7331ac2325943fbc.png](https://i-blog.csdnimg.cn/blog_migrate/697080e2890b173387b0e439d2cc8385.jpeg)
第一个月初有一对刚诞生的兔子
第二个月之后(第三个月初)它们可以生育
每月每对可生育的兔子会诞生下一对新兔子
兔子永不死去
假设在月有兔子总共
对,
月总共有
对。在
月必定总共有
对:因为在
月的时候,前一月(
月)的b对兔子可以存留至第
月(在当月属于新诞生的兔子尚不能生育)。而新生育出的兔子对数等于所有在
月就已存在的
对。
这个问题可以来画个表[3]
![9f220baef64444c981d1443bbec8e10b.png](https://i-blog.csdnimg.cn/blog_migrate/1184aad093d67bbe8849da5e337d42c3.png)
最终可以得到递推式:
这个递推关系又怎么求解呢?
这就是接下来要说的东西了。
常系数线性齐次递推关系的求解
- 定义
设
- 若
,则称该关系为
的
阶线性递推关系。
- 若满足1的情况下,还满足
都是常数,则成之为为
阶常系数线性递推关系。
- 若满足1,2的情况下,还满足
,则称其为
阶常系数齐次线性递推关系。
这个定义和微分方程的定义十分类似,只不过把导数的阶次换成了递推的阶次。
- 例子
- 求解斐波那契数列递推式的解
列特征方程:,求解得到
递归方程的通解为
带入边界条件,得到线性方程组
求解得到
这个也就是在邓俊辉版的数据结构[4]第25页推导出来的结果。 - 求解递推关系
列特征方程,求解得到
递归方程的通解为
带入边界条件,得到线性方程组
求解得到 - 求解
对于这个方程,要先把它化成一个变量的递推方程,由递推式可知,所以有下列关于
的递推式:
这个求解就跟之前的一模一样了。
列特征方程:,根为
递归方程的通解为:
根据边界条件列出线性方程组:
- 求解总结
对于常系数线性齐次递推方程
- 列出特征方程:
,设求解的解为
- 写出带系数的通项公式:
- 代入边界条件,或者叫递归基,得到一个关于
的线性方程组,要想有唯一解要求边界条件的数目和幂次一致,这个原因学过线性代数肯定是没有问题的
证明过程可以参考组合数学引论[5],写的比较清楚。
其实证明过程也可以参考微分方程的求解,两个的求解方式有很多的相似之处。
常系数非齐次递推关系的求解1-利用已知的解形式
- 定义
前面看了常系数齐次递归,知道了齐次是因为
非齐次通常是没有普遍的解法的。
书上会给一些关于特殊的
对于非齐次线性递推方程写 2 个例子。
- 例子
求解 Hanoi 递推式
对于其对应的齐次线性递归式列特征方程:
计算特解:
![cedf0e0364a79b47834fe2868e42d6ef.png](https://i-blog.csdnimg.cn/blog_migrate/3b7c9d5461b2c2801b95f1f7c75712aa.jpeg)
对应的特解形式为
因此,特解为
- 总结
- 求解非齐次递推关系的解的时候,要先求解出对应的齐次方程带系数的通解
- 观察非齐次项
的表达式是否是特殊的表达式,如果是,根据已知的特解的表达形式得到带系数的特解
- 将带系数的特解直接带入递推关系,代入边界条件得到特解的系数,得到不带系数的特解
- 将带系数的通解和特解相加
带入原来的递推表达式中,根据边界条件求出解的系数,这时候去掉系数的解就是递推表达式的解。
常系数非齐次递推关系的求解2-使用生成函数
如果不知道生成函数(或者母函数)是什么,应该先补一下这方面的知识。
- 例子
还是来求解前面的 Hanoi 问题
- 总结
先写到这儿,有空有人看了再往下面写。
分析递归
- 程序实现
- 复杂度分析
递归与迭代的转化
- 关系
- 转化方法
参考
- ^Hanoi问题维基百科 https://zh.wikipedia.org/wiki/%E6%B1%89%E8%AF%BA%E5%A1%94
- ^Fibonacci https://zh.wikipedia.org/wiki/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97
- ^陈景润.组合数学 https://book.douban.com/subject/10808577/
- ^邓俊辉.数据结构 https://book.douban.com/subject/25859528/
- ^ab组合数学引论 https://book.douban.com/subject/4867855/