C++ 汉诺塔的实现(递归)详解

汉诺塔是经典的递归题,可以很好地锻炼递归思维。

题目:

有三根铁柱,铁柱上面有铜片,铜片有大有小,每种规格只有一个。
并且无论什么时候,铜片的叠加顺序只能是小的在上,大的在下。
每次移动只能移动一块铜片,要我们把串在一根铁柱上的某数量的铜片移动到另一个铁柱。

思路:

令三根柱子分别为x,y,z。一开始全部铜片都在x上。

假如有两块规格不同的铜片,那么我们的做法是把最大那块上面的那块从x放到y,然后把最大的从x放到z,再把y上面的放到z。

假如有三个不同规格的铜片,那么我们的想法是先把上面那两块看成一个整体,如果可以把这个整体移动到y,然后把最大的移动到z,再把这个整体移动到z就好了。而两块的时候该怎么做上面已经给出了步骤。

假如有n块不同规格的铜片,那么我们想的就是把最大块上面的n-1块借助z移动到y,再把最大的那块移动到z,最后把y上面的n-1块移动到z。
当它有n块的时候,想着把上面的n-1块从x借助z移动到y;
而上面的n-1块要从x移动到z,该想的是把上面的n-2块从x借助z移动到y;
而上面的n-2块要从x移动到z,该想的是把上面的n-3块从x借助z移动到y;
而上面的n-3块要从x移动到z,该想的是把上面的n-4块从x借助z移动到y;
一直到最后最上面的那块直接从x移动到z。

源码:

#include
using namespace std;
void move(int n, char x, char y, char z)//n是当前函数里铜片的块数,x,y,z代表x借助y移动到z
{
	if (n == 1)//当块数为1时,直接移动到z
	{
		cout << x << "->" << z<<endl;
	}
	else
	{
		move(n - 1, x, z, y);//把上面的n-1块借助z,从x移动到y
		cout << x<<"->" << z<<endl;//把最下面那块从x移动到z
		move(n - 1, y,x,z );//再借助x,把那n-1块从y移动到z
	}
}
void main()
{
	int x;
	cout << "请输汉诺塔的层数:";
	cin >> x;
	move(x, 'X', 'Y', 'Z');
}

你可能感兴趣的:(数据结构,数据结构,算法,递归法,c++)