第一章递归问题
1.1 汉诺塔
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。-转自百度百科
假设汉诺塔有n层(n个盘子)。T(n)为在规则下n个盘子从一根柱子移动到另一根柱子的最小移动次数。
那么我们从最小的n的情况考虑一下
T(1) = 1 T(2) = 3 ……
当然还有特殊请情况,当n=0时是不需要移动的所以。
T(0) = 0
我们如何移动盘子呢,我们先以只有3个盘子的情况来实验(n=3),如果想将所有的盘子转移到另一个柱子,那么势必要先将上面两个盘子移动到中间的柱子,然后再将最大的盘子移动到另一根柱子上,在把另两个盘子放到最大的盘子上,那么看起来T(3) = 2T(2) + 1,转换成n个盘子,即使用最笨的方法进行移动,那么最多我们移动 2T(n-1) +1次就可以完成移动,即当n>0时 T(n) <= 2T(N-1) + 1。 当我们移动最大的盘子时,其余的盘子一定在中间的那根柱子上,所有我们要完成所有盘子的移动的话,至少还要讲n-1个盘子在移动一遍才可以完成移动,即当n>0时 T(n) >= 2T(N-1) + 1。 所以我们总结出
公式一
T(0) = 0
T(n) = 2T(n-1) + 1
我们验证一下,对于T(1)、T(2)、T(3)都成立,我们需要将这个递归公式转换成闭形式。
先把我们可知的n比较小的形式排列一下。
T(0) | T(1) | T(2) | T(3) | T(4) | T(5) | T(6) | T(7) |
---|---|---|---|---|---|---|---|
0 | 1 | 3 | 7 | 15 | 31 | 63 | 127 |
根据已知数据寻找规律再去验证,这看起来像是
T(n) = 2n - 1
那么我们借助上面的公式一来验证一下
T(n) = 2T(n-1) + 1 = 2(2n-1 - 1 ) = 2n - 1
成立
公式二
T(n) = 2n - 1
我们再印证一下
将公式一两端都加1
T(0) + 1 = 0 + 1 = 1
T(n) + 1 = 2T(n-1) + 1 +1 = 2(T(n-1) + 1)
我们再进入一个U,使
U(n) = T(n) + 1
那么公式一可以变成
U(n) = 0 (n=0)
U(n) = T(n) + 1 = 2(T(n-1) + 1)= 2U(n-1) (n>0)
发现此公式的解就是 U(n) = 2n
因此
T(n) = 2n - 1
是正解。