C语言-----递归解决汉诺塔问题(典型递归)

题目:
     这是一个典型的用递归解决的例子,问题是这样的:古代有一个梵塔,塔内有三个座A,B,C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上,有一个和尚想把这64 个盘子从A移到C,规定每次只能移到一个盘子且在移的过程中始终保持打大的在下,小的在上。用编程写出移动过程。

解题思路:
        这个问题看着很麻烦,不知道从何下手,那是想的太复杂,类似这种复杂的问题,首先要做的就是它简单化。我们怎么完成这个呢?应该这样想,如果有另一个和尚把上面63个盘子移走。那么,问题就解决了。此时,老和尚要这样做:

1.让第二个和尚将63 个盘子从A盘移到B盘:

2.自己将最下面的盘子从A盘移到C盘:

3.在让第二个和尚将63个盘子从B盘移到C座。

现在就完成了,此时有一个问题就是怎么让第二个和尚从A盘移到B盘?这时 需要第三个和尚把62个盘子移走,第二个和尚就能把第63个盘子从A盘移到B盘。第三个和尚需要这样做:

1. 让第三个和尚将62个盘子从A移到C盘;

2.自己将第63个盘子从A盘移到B 盘;

3.在让第三个和尚将62个盘子从C盘移到B 盘。

如此递归下去,可见,递归的最后一个条件是最后一个和尚只须移到一个盘子。
编写程序:
         用两个函数实现上述功能,hanoi函数实现小和尚的任务,用move函数模拟老和尚自己移到盘子的任务。

void move(char x,char y)
{
	printf("%c-------%c\n",x,y);
}
void hanoi(int m,char a,char b,char c)
{
	void move(char x,char y);
	if(m==1)
	{
		move(a,c);
	}
	else
	{
		hanoi( m-1,a, c, b);//中间过程
		move(a,c);   //移到正确的地方的函数
		hanoi( m-1, b, a, c);//中间过程
	}
}
int main()
{
	int n=0;
	int m=0;
	printf("请输入盘子数:");
	scanf("%d",&m);
	hanoi(m,'A','B','C');
	system("pause");
	return 0;
}

结果如下:

猜你喜欢

转载自blog.csdn.net/abc_xixi111/article/details/80004800