Hanoi塔问题

为了保证递归函数正确执行,系统需设立一个 递归工作栈 作为整个递归函数运行期间使用的数据存储区。每一层递归所需信息构成一个 工作记录 ,其中包括所有的实参、所有的局部变量以及上一层的返回地址。
每进入一层递归,就产生一个新的工作记录 压入 栈顶。每退出一层递归就从栈顶 弹出 一个工作记录,则当前执行层的工作记录必须是递归工作栈栈顶的工作记录,称这个记录为“ 活动记录 ”,并称指示活动记录的栈顶指针为“ 当前环境指针 ”。

 

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


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值