汉诺塔 递归 C语言

汉诺塔(C语言递归)

问题描述:
汉诺塔:汉诺塔(Tower of Hanoi)源于印度传说中,大梵天创造世界时造了三根金钢石柱子,其中一根柱子自底向上叠着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
在这里插入图片描述
起到中转作用。 在进行转移操作时,都必须确保大盘在小盘下面,且每次只能移动一个圆盘,最终c柱上有所有的盘子且也是从上到下按从小到大的顺序。

分析:假设A上有n个盘子.

///////////////////////////////////////////////////////////////////////////////////////////////////////
第一步:
我们建立一个函数 f (n,①,②,③),这个函数的功能就是把①上面的n个盘子借助②移动到③上面去。那我们是不是只要调用 f (n,A,B,C),就可以实现把A上面的n个盘子借助B移动到C上面去。

///////////////////////////////////////////////////////////////////////////////////////////////////////

第二步:这个函数怎么实现呢?
我们接着分析调用 f (n,A,B,C)时,是怎么样把A上面的n个盘子借助B移动到C上面去呢?可以分为三步:
(1):先调用 f (n-1,A,C,B),将A上面的除了最底下最大的盘子之外,其余的n-1个借用C转移到B上面去。
(2):将A上面最大的盘子移到C上去。
(3):再调用 f (n-1,B,A,C)。把B上n-1个盘子转移到C上去,问题解决。

///////////////////////////////////////////////////////////////////////////////////////////////////////

第三步:
那么问题来了,第二步中的(2)可以实现。但是(1)、(3)怎么实现呢。
先看(1),如何实现调用 f (n-1,A,C,B),将A上面的n-1个借用C转移到B上面去。等会,怎么这么熟悉??这不就是最开始的问题吗?那我们继续采用第二步的方法。将问题转化为 将A上面的n-2个借助B转移到C上。依次类推,直到问题转化为只剩A最上面一个盘子时,直接转移。(3)也同理。

///////////////////////////////////////////////////////////////////////////////////////////////////////
代码如下:
在这里插入图片描述
文章系本人原创,转载请注明作者和出处。

猜你喜欢

转载自blog.csdn.net/xiaomu_Y/article/details/106343884