C语言:汉诺塔(Hanoi)游戏(递归思想的应用)

汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

 A表示金片初始的那根柱子,B表示过渡柱,C表示目标柱,看似复杂的问题,实际上可以分为三大步

第1步:将A柱上的n-1个金片通过C柱移动到B柱

第2步:将第n个(最大的)金片从A柱移动到C柱

第3步:将B柱上n-1个金片通过A柱移动到C柱

这样就把移动n个金片转化为移动n-1个金片的问题,即可用移动n-1个金片的问题进行递归描述,从而转化为移动一个金片的问题

用程序实现如下

#include<stdio.h>

int i=0;                               /*全局变量i,表示移动次数*/

void output(int n,char take,char put); /*声明函数,用于输出步骤*/

void move(int n,char A,char B,char C)  /*定义函数,移动金片*/
{
	if(n==0)                           /*n=0时不做处理*/
		return;
	if(n==1)                           /*n=1时直接把金片从A移动到C*/
		output(n,A,C);
	else
	{
		move(n-1,A,C,B);               /*将n-1个金片从A通过C移动到B*/
		output(n,A,C);                 /*将第n个金片从A移动到C*/
		move(n-1,B,A,C);               /*将n-1个金片从B经过A移动到C*/
	}
}

int main()
{
	int n;                    /*一共有n个金片*/
	char A='A',B='B',C='C';   /*三根柱子分别定义为A,B,C*/
	scanf("%d",&n); 
	move(n,A,B,C);            /*调用函数进行移动操作*/
	return 0;
}

void output(int n,char take,char put)
{
	i++;                      /*每次移动,i的值增加1*/
	printf("[%d] move%d: %c-->%c\n",i,n,take,put);
}

例如我们输入3,结果如下

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值