day03
题目:移动多少盘子才能完成汉诺塔游戏?
题目描述:
汉诺塔问题是印度的一个古老传说,在一个庙里有三根金刚石棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不停地把它们一个个地从这另一根棒上,规定可用中间的一根棒作为辅助,但每次只能搬一个,而且大的不能放在小的上面,经过运算移动圆片的次数为1844 6744 0737 0955 1615,看来众僧们耗尽毕生精力也不可能完成金片的移动。
后来这个传说就演变为汉诺塔游戏,游戏规则如下:
(1)有3根柱子A,B,C,A柱子上有若干盘子。
(2)每次移动一块盘子,小的只能叠在大的上面。
(3)把所有盘子全部从A柱移到C柱上。
(4)经过研究发现,汉诺塔的破解很简单,就是按照移动规则向一个方向移动金片.
(5)如3阶汉诺塔的移动:A->C,A->B,C->B,A->C,B->A,B->CA->C。
此外汉诺塔问题也是程序设计中的经典递归问题。
解析:
如果柱子标为ABC,要由A搬至C,在只有一个盘子时,就将它直接搬至C,当有两个盘子时,就将B作为辅助柱,如果盘子数超过两个,将第三个以下的盘子叠起来,就很简单了,每次处理两个盘子,也就是:A->B,A->C,B->C这三个步骤,而被遮住的部分,其实就是进入程式的递归处理,事实上,若有n个盘子,则移动完毕所需次数为2的n次方减去1,所以盘子数为64时,所需的次数为:2的64次方减去1=1844 6744 0737 0955 1615,假设每秒搬一个盘子的话,大约需要搬5850亿年,实现代码如下:
<script type="text/javascript">
function hannuo(n,x,y,z){
if(n==1){
console.log('移动盘1从'+x+'到'+z)
}else{
hannuo(n-1,x,z,y)
console.log('移动盘'+n+'从'+x+'到'+z)
hannuo(n-1,y,x,z)
}
}
</script>
假设有4个盘子,3根柱子,运行结果如下: