c:递归实现汉诺塔

c语言:通过递归实现经典问题汉诺塔
汉诺塔(hanoi):
汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。
原理是:有三根柱子,其中一根从下往上按照大小顺序放着若干个圆盘,要求将这些圆盘移动到另一根柱子上,并且小盘上不能放在大盘之上每次只能移动一个圆盘
(A,B,C三个柱子)

                  (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)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值