hanoi塔问题是什么?
相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。
如何实现呢?这里咱介绍递归方法,
对于代码,这里先给出
#include<stdio.h>
void move(int n,char A,char B,char C)
{
if (n == 1)
{
printf("%c移动到%c\n",A,C);
}
if (n > 1)
{
move(n - 1,A,C,B);
printf("%c移动到%c\n", A, C);
move(n - 1, B, A, C);
}
}
int main()
{
char A = 'a',B='b',C='c';
int m = 3;
move(m, A, B, C);
}
代码很简单,但是如何理解就有点不同,我认为,这个是典型的递归思想的题目,可以有参考价值
数学归纳法 咱们学过数学都知道这个是数学中证明题巨好用的方法,这里我们把这种思想引进c 语言中了解Hanoi塔问题是如何解决的
首先我先介绍一下数学归纳法:
1.当n=1时证明等式成立,
2.假设n=k时成立,证明n=k+1同样成立则得证
void move(int n,char A,char B,char C)//注意这个函数的意思:将n个盘子从A借助B移动到C
{
//首先,数学归纳法要讨论开头即为n=1时的情况
if (n == 1)
{
printf("%c移动到%c\n",A,C); //这样,A就移到C上。n=1成立
}
//然后假设当n成立时,n+1也成立,为了方便我们讨论n与n-1
if (n > 1)
{
//此时为n,我们需要利用n-1表达出n来,注意因为是函数调用,所以如果n表达出来即为证明成立。
move(n - 1,A,C,B);//这个为将n-1个从A移动到B
printf("%c移动到%c\n", A, C);//将底盘移动到C
move(n - 1, B, A, C);//将B中的n-1个移到C
}
}
这样就实现了盘子的移动
我们再细看n=1时成立,而n=2时我们用n=1表示出来成立,一直推下去就实现了
借此,我们可以拓展到许多其他递归问题,Hanoi塔问题只是一个经典的例子