C语言递归解决汉诺塔问题

#include<stdio.h>
int count=1;
void hanoi(int n,char a,char b,char c)
{
	
	if(n==1)
	{
		printf("%d %c ---> %c\n",count,a,c);
		count++;
	}
	else
	{
		hanoi(n-1,a,c,b);
		printf("%d %c ---> %c\n",count,a,c);
		hanoi(n-1,b,a,c);
	}
 } 

int main()
{
	int n;
	scanf("%d",&n);
	hanoi(n,'a','b','c');
	return 0;
}

这里做一个简单的分析:

首先我们假设将所以盘子都从A盘移动到C盘上我们只需要三步

1  将A盘上除了最大的盘子以外的全部盘子(看作1个整体)移动到B盘上

2  将A盘上的最大盘子移动到C盘上

3 将B盘上的(整体)盘子移动到C盘上

这里我们的思想是交换柱子来实现只输出A ---> C(注意这里的A和C并非不变)

我们在第1步的时候将C柱和B柱的位置交换(有点类似我们写三个数字排序的算法),这样我们把A上的盘子移动到C位置上的柱子就相当于我们把它们移动到B柱上了!!!!

同理,在我们在需要将B盘上的盘子移动到C柱上的时候,我们将A柱和B柱的位置交换这样我们就实现了即使是输出A到C,实际上我们是将B盘上的盘子移动到C盘上了!!!

如果仍然无法理解的话

这里给出用递归算法的来解决汉诺塔问题_PharahBai的博客-CSDN博客_汉诺塔递归算法

他的解释很好,我也是看了他的博客才理解的

 

上一篇:emjoin存入数据库


下一篇:Python数据结构(时间和空间复杂度)