汉诺塔递归代码

汉诺塔递归代码

汉诺塔

今天发现写的代码还是记一下,不然极易忘记,真的蛋疼。

代码

#include<iostream>
using namespace std;
void move(char a,char b,char c,int n);
int main()
{
    int n;
    char a='A',b='B',c='C';      
    cout<<"汉诺塔有多少层:";
    cin>>n;  
    move(a,b,c,n);
    return 0; 
}

void move(char a,char b,char c,int n) 
{   
  if(n==1){ 
    cout<<a<<"到"<<c<<endl;
  } 
  if(n>=2){ 
    move(a,c,b,n-1);
    cout<<a<<"到"<<c<<endl;
    move(b,a,c,n-1);
  } 
}

理解

非常简单和经典的一道递归题,就是一开始没转过弯来,其实就是递归就是把问题简化,从n层一步步递归到1层去解决问题,然后再层层递归回来解决上一层的问题。

这道题重点思路就是用来递归的move函数,具体要怎么写呢?首先就是要理解move函数的作用,该函数的作用理解来就是将n个铁块从a塔借助b塔全部移动到c塔上,那么我们要如何完成这个操作呢,这时就要将n设为3块,用较简单的铁块数去推规律,当n=3时,那么就是:
a–>c
a–>b
c–>b
a–>c
b–>a
b–>c
a–>c

可以看出如果要将最大的一块移动到c塔上,则需要a塔铁块里上面的两块首先借助c塔移动到b塔上,即n-1块需要借助c塔移动到b塔上,即move(a,c,b,n-1),然后再移动最后一块,即a–>c,最后则只需要将b塔上的n-1块铁块借助a塔移动到c塔上,即move(b,a,c,n-1),我们就已经把move函数构思好了,这便是汉诺塔的一个共通的规律,将一个复杂的移动操作简化为三部分,然后再将三部分中较复杂的部分继续简化成三部分,就这样一路简化直至n==1,最后得出n层汉诺塔要如何移动才能全部移动到另一个塔上。

其中要注意:n==1这个部分,我时常会写成n=1,真滴蠢。。。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值