汉诺塔问题目录
1. 汉诺塔问题简介
2. 汉诺塔问题分析
1.汉诺塔问题简介
汉诺塔问题源自于印度一个古老的传说,印度教的“创造之神”梵天创造世界时做了 3 根金刚石柱,其中的一根柱子上按照从小到大的顺序摞着 64 个黄金圆盘。梵天命令一个叫婆罗门的门徒将所有的圆盘移动到另一个柱子上,并规定每次只能移动柱子最顶端的一个圆盘并且在每个柱子上,小圆盘永远要位于大圆盘之上。
问题描述了三个石柱A,B,C,其中A石柱上有n(64)个圆盘,要求每次只移动一个圆盘且小圆盘必须在大圆盘上,求移动的方法。
2.汉诺塔问题分析
初入手这道题会觉得无法上手,但我们可以将该类复杂问题简单化,我的方法如下:
首先,实现两层汉诺塔问题。
然后我们可以将n层汉诺塔问题转换为两层汉诺塔问题。(即前n-1层与第n层)再将n-1层做如上转换直到将其转换为两层。
此处为我的编程实现,编程实现后面则是我实现汉诺塔问题的具体方法。
假设n层,则将前n-1由A移至B,将第n层由A移至C,再将前n-1由B移至C 。
有些同学可能会觉得该类问题的第一次转移可能会是由A至B也可能是由A至C(取决于n的奇偶,奇数A-C,偶数A-B),所以认为无法通过两层汉诺塔整体实现。
但是由于我在这里是通过转变函数中参数顺序来进行调整的,并且我的函数最后一个参数指的是圆盘的落点,第二个指的是圆盘的出发点。
如果n是偶数,经过n-1由A-B时由于传参过程中将b,c位置改变,最终由于输出的时候是两层汉诺塔,所以b,c改变了偶次,即相当于未改变,于是输出为A-B
如果n是奇数,经过n-1由A-B时由于传参过程中将b,c位置改变,最终由于输出的时候是两层汉诺塔,所以b,c改变了奇次,即相当于改变一次,于是输出为A-C
通过改变函数传参顺序实现改变一次即可实现汉诺塔问题。
最后,身为大一新生,如有错误,还望大家能够指正!