函数的递归调用举例之汉诺塔问题模型

目录

前言:

●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!

正文

汉诺塔(Tower of Hanoi)问题模型:

汉诺塔玩具模型                                                    由4个圆盘构成的汉诺塔移动步骤

由3个盘子移动图解:

 运行结果:

 ●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!


前言:

●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!

正文

汉诺塔(Tower of Hanoi)问题模型:

假设有n个盘子,大盘在下,小盘在上。要求将所有盘子由A杆移动到C杆,可以借助B杆,但移动时必须满足以下要求:

(1)每次只能移动1个盘子;

(2)移动过程中,每个杆上的盘子必须保证大盘在下,小盘在上

              

汉诺塔玩具模型                                                    由4个圆盘构成的汉诺塔移动步骤

由3个盘子移动图解:

 

 

 

 

 

  综合可得到移动3个盘子的步骤为: ① A→C,A→B,C→B, ② A→C, ③ B→A,B→C,A→C。 共经历7步。

由此可推出: 移动n个盘子要经历(2n-1)步。

 先分析A杆上3个盘子移到C杆上的过程:

① 将A杆上2个盘子移到B杆上(借助C杆)。

② 将A杆上1个盘子移到C杆上。

③ 将B杆上2个盘子移到C杆上(借助A杆)。 其中②可直接实现。①可递归分解为: 将A杆上1个盘子从A杆移到C杆; 将A杆上1个盘子从A杆移到B杆; 将C杆上1个盘子从C杆移到B杆。 第③步可以分解为: 将B杆上1个盘子从B杆移到A杆上; 将B杆上1个盘子从B杆移到C杆上; 将A杆上1个盘子从A杆移到C杆上。

 分析可得:n个盘子(n>1)时,若将其从A杆上移至C杆上,需要借助B杆,可以分三步:

(1)将A最上面的n-1个盘子借助C移到B上,即Hn-1次;

(2)将A最下面的一个盘子移到C上,一次就好;

(3)将B上面的n-1个盘子借助A移到C上,即Hn-1次。        

很显然,汉诺塔问题是一个递归问题,可以编写递归函数来实现。

当n>1时,移动盘子的递归过程就是上述三个步骤;递归终止条件就是当n=1时,直接将盘子从A杆移至C杆即可。

汉诺塔问题程序如下:
#include <stdio.h>
void  main()
{	int nd;
	void hanoi(int,char,char,char); 
	printf("input the number of disks:");
	scanf("%d",&nd);
	printf("the step to moving %2d disks:\n",nd);
	hanoi(nd,'A','B','C'); 
}
void hanoi(int n,char a,char b,char c)
{	if(n==1)
		printf("%c-->%c\n",a,c); 
	else
	{	hanoi(n-1,a,c,b);     
		printf("%c-->%c\n",a,c); 
		hanoi(n-1,b,a,c); 
	}
}

 运行结果:

 

注:函数的功能是按要求移动盘子,无需返回值,是void类型。函数的参数有4个,一个是盘子数n,另外三个是代表盘杆的字符变量a,b和c。 

 ●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值