汉诺塔问题(C语言)
题目要求:汉诺塔问题是个典型的函数递归问题
古代有一个梵塔,塔内有3个座A,B,C。开始时A上有64个盘子,盘子大小不等,大的在下,小的在上(如图所示)。有一个老和尚想把这64个盘子从A移动到C,但规定每次只允许移动一个盘,且移动过程中在3个座上都始终保持大盘在下,小盘在上。在移动过程中可以利用B座,要求编程输出移动盘子的步骤。
思路:
- 总共需要移动大概2ˆ64次盘子,一般人是不可能直接确定每一个具体步骤的
- 但可以这样简单想:假如有另一个和尚能有办法把上面的63个盘子从一个座移动到另一个座,那么问题就解决了。此时老和尚只须这样做:
(1). 命令第2个和尚将63个盘子从A移到B;
(2). 自己将1个盘子(最底下的、最大的盘子)从A移到C;
(3). 再命令第2个和尚将63个盘子从B移到C。
如图所示:
但是,有一个实际问题仍未解决:第2个和尚怎么把63个盘子从A移到B?
为了解决这个问题,第2个和尚可以这样:
(1). 命令第3个和尚将62个盘子从A移到C;
(2). 自己将1个盘子从A移到B;
(3). 再命令第3个和尚将62个盘子从C移到B。
如此递归,直到后来找到第63个和尚,让他完成将2个盘子从一个座移到另一个座,进行到此,问题就接近解决了。最后找到第64个和尚,让他完成将1个盘子从一个座移到另一个座,至此,工作全部落实。
应当说明,只有第64个和尚任务完成后,第63个和尚的任务才能完成。只有第2~64和和尚的任务都完成后,第1个和尚的任务才能完成。这就是一个典型的递归问题。
为了便于理解,先分析将A上的3个盘子移到C上
(1). 将A上的2个盘子移到B上;
(2). 将A上的1个盘子移到C上;
(3). 将B上的2个盘子移到C上。
其中第(2)步可以直接实现,第(1)步又可以用递归方法分解:
(1). 将A上的1个盘子移到C上;
(2). 将A上的1个盘子移到B上;
(