下面是小编为大家整理的汉诺塔步数与层数关系(侯瑞泽,刘一帆,张哲晨)【优秀范文】,供大家参考。
汉诺塔步数与层数的关系 问题背景 :汉诺塔是根据一个传说形成的一个问题。汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着 64 片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移 动一个圆盘。传说将所有黄金圆片移完,宇宙就会爆炸 关于汉诺塔的经典问题:有三根相邻的柱子,标号为 A,B,C,A 柱子上从下到上按金字塔状叠放着 n 个不同大小的圆盘,要把所有盘子一个一个移动到柱子 B 上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方,请问至少需要多少次移动。
题目要求:1.在小圆盘上不能放大圆盘。
2.在三根柱子之间一回只能移动一个圆盘。
3.只能移动在最顶端的圆盘。
模型建立 令 令 f (x )为 为 x 个圆片时所需要的最少步数 (1 )当 当 n=1 时
只需将 A 柱圆片移至 C 柱 此时,f(1)=1
(2 )当 当 n=2 时
将 A 柱上第一个圆片移至 B 柱 将 A 柱上第二个圆片移至 C 柱 将 B 柱上的圆片移至 C 柱 f(2)=3
由此猜测,f(x)= 2^(x)-1 以下给出证明 设 A 柱上有 x 个圆片,则移动 x-1 个圆片的步数为 f(x-1) 那么 f(x)=2f(x-1)+1 (即先把(x-1)个圆盘移到 B 柱,再将最后一个圆盘移到 C 柱,再将(x-1)个圆盘移到 C柱)
等号两侧同时加 1 得:f(x)+1=2(f(x-1)+1) 令 F(x)=f(x)+1 则 F(x)=2F(x-1) 其中 F(1)=f(1)+1=1+1=2 所以,F(x)={2,4,8,.....,2^n} 所以 f(x)=F(x)-1=2^(x)-1 以下给出汉诺塔二进制的解法
拿从 0 记到十进制 15 为例 0000-> 0001 -> 0010 -> 0011 -> 0100 -> 0101 -> 0110 -> 0111-> 1000 -> 1001 -> 1010 -> 1011 ->1100 -> 1101 -> 1110 -> 1111 1000 是数字 8,我们可以发现从 0 记到 15 的过程其实是对称的 从 0 记到 7,一共经加了七次(可以数一下第一行的箭头数)
加一,实现了由 7 加到 8 再从 8 记到 15,同样加了七次(数一下最后一行的箭头数)
0000 -> 0001 即把 0 从第一根柱子移到右边的柱子上 0001 -> 0010 就将 1 号盘移动到剩余的柱子上
0010 -> 0011 个位数加一,将 0 号盘移动到右边柱子上 0011 -> 0100 我们的数字又加了一位,将 2 号盘向右移动
0100 -> 0101,又是个位数字加一,可是 0 号盘子没有可以继续右移的柱子了,起始柱子上
0101 -> 0110 应该移动 1 号盘子,可是既没有可以右移的柱子,起始的放在中间柱子上吧
0110 -> 0111 又是个位数由 0 加 1,将它移动到右边的柱子 0111 -> 1000 从 7 数到 8 了,将 3 号盘子右移
接下来的过程,就和刚才的一样,实质上是抛弃“千位”,从 000 记到 111 我们可以惊奇的发现,这个流程真的和我们正常做汉诺塔问题完全一致
实际上,这个做法是规定了二进制数加一时,应该进行什么样的模拟操作 我们规定“移动”为向右移动一根柱子,检查条件,无法放下就换下一根,且末尾柱子的下一根,是起始柱子 另外,某一位数,由 0 变为 1,就挪动代表该位的盘子,比如“个位” 00 -> 01 则移动 0 号盘子 在这样的规则下,非常奇异地,它符合了汉诺塔最优解的流程 现在我们再看背景中的问题如果有 64 个圆片 则 f(64)=2^64-1=18446744073709551615 步 如果一个人一秒钟可以移动一片 那么全部移完需要 584942417355 年,显然以人类现在的水平是无法做到的