c语言:通过递归实现经典问题汉诺塔
汉诺塔(hanoi):
汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。
原理是:有三根柱子,其中一根从下往上按照大小顺序放着若干个圆盘,要求将这些圆盘移动到另一根柱子上,并且小盘上不能放在大盘之上,每次只能移动一个圆盘。
(A,B,C三个柱子)
第一步:逻辑方法分析:
按照这个思路,我们先写个伪算法!方便理解如何解决这个程序的编写(ps:伪算法很重要)。
对于一个盘子移动,我们解决的是从哪里移到哪里!
那么2个盘子,先把第一个从A柱子上移动到C柱子上;
那么n个盘子,我们把前n-1当成一个整体,完成的事情就是把n-1个盘子从A柱子上借助C柱子,移动到B柱子上,然后再把第n个盘子从A柱子上移动到C柱子上;然后再把在B柱子上的那n-1个盘子借助A柱子移动到C柱子上,则任务ok;
至此,我们可以想构建汉诺塔这个函数,需要几个形参呢?
1:盘子的个数;2:A柱子;3:B柱子;4:C柱子。
我们简单声明一下是不是:
void hannuota(int n,char A,char B,char C);
第二步:伪算法
void hannuota(int n,char A,char B,char C)
{
if(n==1)
将第1块直接从A柱移动到C柱上;
else
{
先将第n-1块从A通过C移动到B;
将第n块直接从A柱移动到C柱上;
再将那n-1块从B通过A移动到C;
}
}
第三步:程序实现
void hannuota(int n,char A,char B,char C)
{
if(n==1)
printf("将第%d块从%c柱移动到%c柱上\n",n,A,C);
else
{
hannuota(n-1,A,C,B);
printf("将第%d块从%c柱移动到%c柱上\n",n,A,C);
hannuota(n-1,B,A,C);
}
}
到此,是不是感觉很玄乎,递归怎么这么神奇!其实就是这么神奇,你只要分析到,第n和第n-1的关系,其余的交给计算机就行了,这就是节省我们大脑去想每一步怎么操作了。这个与我们常见的阶乘,求和不同,好像不很容易就想到递归,没想到这样的问题也可以用递归哈哈。(ps:我刚开始也不是很理解,然后通过这样的思路去分析,发现也很简单!重要的是第一步到第二步,第三步写程序那就很easy了)
附完整程序:
#include<stdio.h>
void hannuota(int n,char A,char B,char C);
int main(void)
{
int n;
char ch1='a';
char ch2='b';
char ch3='c';
scanf("%d",&n);
hannuota(n,ch1,ch2,ch3);
return 0;
}
void hannuota(int n,char A,char B,char C)
{
if(n==1)
printf("将第%d块从%c柱移动到%c柱上\n",n,A,C);
else
{
hannuota(n-1,A,C,B);
printf("将第%d块从%c柱移动到%c柱上\n",n,A,C);
hannuota(n-1,B,A,C);
}
}
我们输入n为2:
我们输入n为3:
至此,已经介绍结束,读者可自行验证!
递归很重要!想想能否用循环解决呢???
估计会很麻烦把,记住所有的循环可以转化为递归,但是递归不一定可以能用循环解决。
(zhj~ivan20204192355)