为了保证递归函数正确执行,系统需设立一个
“
递归工作栈
”
作为整个递归函数运行期间使用的数据存储区。每一层递归所需信息构成一个
“
工作记录
”
,其中包括所有的实参、所有的局部变量以及上一层的返回地址。
每进入一层递归,就产生一个新的工作记录
压入
栈顶。每退出一层递归就从栈顶
弹出
一个工作记录,则当前执行层的工作记录必须是递归工作栈栈顶的工作记录,称这个记录为“
活动记录
”,并称指示活动记录的栈顶指针为“
当前环境指针
”。
分治算法与软件设计的模块化方法类似。为了解决一个大的问题,将一个规模为n的问题分解为规模较小的子问题,这些子问题相互独立并且和原问题相同。分解这些子问题,最后将各个子问题的解合并到原问题的解。子问题与原问题类似,可以递归的使用分治策略解决。
Hanio(n, x, y, z)问题分成三个子问题:
问题1:Hanio(n - 1, x, z, y)
将x柱上的n - 1个圆盘借助Z柱移到Y柱上,此时X柱上只剩下第n个圆盘
问题2:Move(n, x, z)
将X柱上的第n个移动到Z柱
问题3:Hanio( n -1, y, x, z)
将Y柱上的n - 1个圆盘借助X柱移动到Z柱上
n ==1时可以直接求解
#include <iostream>
using namespace std;
//移动盘子
void Move(int n, char x, char y)
{
cout << "移动 " << n << " 号盘子" << "从 " << x << " 柱到" << y << " 柱" << endl;
}
//递归调用
void Hanoi(int n, char x, char y, char z)
{
if(n == 0)
cout << "There is no dish!" << endl;
if(n == 1)
{
Move(1, x, z);
}else
{
Hanoi(n - 1, x, z, y);
Move(n, x, z);
Hanoi(n - 1, y, x, z);
}
}
int main()
{
cout << "The Hanio n is :" << endl;
int n;
cin >> n;
Hanoi(n, 'x', 'y', 'z');
return 0;
}