利用递归函数求解汉诺塔问题,用递归实现汉诺塔问题
#代码处于略低的位置——(6)河内塔问题(1):
条件:在铜板装置上,有三根棒(没有A、B、C)和N个圆盘从下到上依次放置在A杆上。
目标:将A条上的所有磁盘移动到C条上,并保持原来的堆叠顺序。
规则:一次只能移动一个板块;
在移动过程中,在所有三个杆上保持大板向下,小板向上。
(2)思想——函数递归:
函数递归本质上是一个循环;
任何函数递归都必须有限制才能使其退出递归。所以我们把退出条件写在开头,也就是递归函数最内层n=1的移动方向。
(3)然后我们用函数的递归来完成剩下的步骤,使其逐渐逼近最后一步。
(3)找出循环(将磁盘分为两层,即上层(n-1)和下层最大的第n个磁盘):
假设有两个圆盘(图中红框圈出的视为一个圆盘);
摊成三张碟(见图中红框为两张碟);
摊成N片(见图中红框为n-1片);
编辑
(4)归纳思想:
没有圆盘的底柱效果相当于只有最大圆盘的底柱效果,即当我们移动上面(n -1)个圆盘时,请忽略第n个圆盘,这样更有助于理解;
当我们要移动上面的n-1个磁盘时,按照规则是无法移动的,所以只能移动上面的n-2个磁盘,以此类推。我们最终可以移动的第一个磁盘是第一个磁盘。根据这个想法,我们有了函数递归。
(5)如何理解A B C在5)hanoi()函数中的不同位置:
(A,B,C)的关系是:将A列中的磁盘通过B列移动到C列;
从图(A)换到图(B)时,我们需要借助B列转移圆盘,即n-1层的圆盘通过C列从A列堆叠到B列,所以是Hanoi (a,C,B);
从图(B)换到图(C)时,我们会直接将A列的圆盘移动到C列,即hanoi(A,B,C),这也代表只有一个圆盘时的移动方向;
从图(C)换到图(D)时,同样需要借助A列转移圆盘,即n-1层圆盘上的n-2层圆盘通过A列从B列堆叠到C列,所以是Hanoi (B,A,C);
就这样,我们每次搬家,都会把所有的盘从小到大按一定的规律堆在C柱上.
(6)代码如下:
# define _ CRT _ SECURE _ NO _ WARNINGS 1
#包含stdio.h
void hanoi(int n,char A,char B,char C)
{
如果(n==1)
{
printf(%c- %c ,A,C);
}
其他
{
河内(n - 1,A,C,B);
printf(%c- %c ,A,C);
河内(n - 1,B,A,C);
}
}
int main()
{
int n=0;
char a,b,c;
scanf(%d ,
hanoi(n, a , b , c );
返回0;
}(7)重复上述过程后,结果如下:
(因为A B C在循环中有规律地处于交换位置,盘面移动方向的起点和终点是由其数的奇偶性决定的,有一定的规律。)
输入:3(奇数)
a- c a- b c- b a- c b- a b- c a- c
输入:4(偶数)
a-b a-c B- c a-b c-a c-b a-b a-c B- c B- c B- a c-a B- c a-b a-b a-b a-c B- c
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。