数学归纳法:
数学归纳法有好几种形式,我们这里采用最常见的一种。其他形式,详见。
PS:有时候维基百科+百度百科,对比的看,效果更好。维基更细,但百度百科可以帮助我们总结,例子也更中国思维,更容易理解。
当我们要证明自然数范围内的某种规律时,可采用这种方法:
- 当n=1时,规律成立。
- 假设n=k时,规律成立。如果可证明n=k+1时,规律依然成立。那么该规律在自然数范围内成立。
(思想:层层递推)
递归问题:
什么时候使用递归?
- 定义是递归的:Fibonacci数列
- 数据结构是递归的:链表
- 问题解法是递归的:Hanoi塔
Hanoi problem:
特别感谢:https://www.cnblogs.com/xxNote/articles/3965739.html
以及严蔚敏老师的《数据结构》
假设圆盘的个数为n,圆盘编号从上到下依次为1,2,3,4,……n,我们开始从中找规律:
①当 n = 1 时,从 A 移动到 C 显然能够完成,设需要移动的次数是a1。
②当 n = 2 时,由①可知从把 1 号盘子从 A 移动到 B能够完成(B 和 C 是等效的)此时移动次数为a1。
之后把2号盘子移动到C上面此时移动次数为a1 + 1。
这时把1号盘子从B移动到C和①是等价的,
移动后总的移动次数是a2 = a1 + 1 + a1。
③当n = 3时,由②可知移动成下图的效果是可以实现的,
此时移动的次数是a2,接着把3号盘子移动到C上面
此时移动的次数是a2 + 1,这时把1和2号盘子移动到C上面(移动过程中3号盘子始终不会动)和②等效的,移动完成之后如下
移动的总次数是a3 = a2 + 1 + a2
④当n=4时,由③可知移动成下图的效果是可以实现的,
此时移动的次数是a3
把4号盘子从A移动到C
此时移动的次数是a3 + 1
接下来把123号盘子从B移动到C的过程又和③等效了移动之后如下
移动的总次数是a4 = a3 + 1 + a3
数学归纳法,首先,针对具体的问题,我们要归纳总结出规律。从上述例子中,我们可以得出规律:(n>1)
利用数学归纳法证明:
- 当k=1,2时,
- 假设当n=k(k>1)时,等式成立:
当n=k+1时:在k+1盘上有k层盘,由(2)和汉诺塔规则知,这k层盘可以挪到B,需要
步,k+1盘由A到C需要1步,K层盘由B到C同样需要
步。由此可知下式成立:
综上所述,对于Hanoi规律
在n>1的自然数范围内都成立。
此外 我们还可以移动n个盘子需要的搬运次数:
等价于
,后式是一个等比数列,比为2.
即:等比数列通项公式为:
最后可得:
代码:
// 分治递归思想,递归出口+调用规模变小但相同的处理方法
void Hanoi(int n ,char A, char B, charC)
{
if(1==n) move(A, 1,C);
else{
Hanoi(n-1,A,B,C); // else中的三句话,就是上边的$$a_{n}=a_{n-1}+1+a_{n-1}$$
move(A,n,C);
Hanoi(n-1,B,A,C);
}
}
总结:
汉诺塔问题属于递归中解法是递归的问题类型,其搬运次数和盘子数量呈指数关系,当盘子数过多,问题需要步骤过多,花费的时间也就越多。