Hanoi塔问题

来源:互联网 发布:js 遍历子节点 编辑:程序博客网 时间:2024/05/16 10:24
为了保证递归函数正确执行,系统需设立一个递归工作栈作为整个递归函数运行期间使用的数据存储区。每一层递归所需信息构成一个工作记录,其中包括所有的实参、所有的局部变量以及上一层的返回地址。
每进入一层递归,就产生一个新的工作记录压入栈顶。每退出一层递归就从栈顶弹出一个工作记录,则当前执行层的工作记录必须是递归工作栈栈顶的工作记录,称这个记录为“活动记录”,并称指示活动记录的栈顶指针为“当前环境指针”。

 

分治算法与软件设计的模块化方法类似。为了解决一个大的问题,将一个规模为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;}


 

原创粉丝点击