c++学习笔记之汉诺塔问题


怀着一颗菜鸟的心小心翼翼的写着我的第一个博客,也是仅仅记录下我学习的过程,正如我的个人说明那样,一天进步一点点,还望多多指正。

本来想一下子浏览完《C++程序设计》面向对象之前的部分,毕竟之前在课上好好学过C,有一定的C基础,但在浏览到递归这一章的时候,突然就被汉诺塔卡了好几天,不过好在在今天弄明白了,于是马不停蹄的赶紧把它记录下来,希望今后对自己有用吧。

先把程序上了:

#include 
   
   
    
    

using namespace std;

void moveDisks(int n,char fromTower,char toTower,char auxTower)
//函数的功能是寻找在借助auxTower下将n个盘子从fromTower移动到toTower的方法
{
    if(n==1)

    cout<<"Move desk "<
    
    
     
     <<" from "<
     
     
      
      <<" to "<
      
      
       
       <
       
        
       
      
      
     
     
    
    
   
   
一开始总是纠结在那个参数的问题上,老是想为啥调用moveDisks的时候,当n为2时,n-1不就是1吗,不就停止了吗,哪有后来的代码了。我觉得moveDisks函数就是当n为2的一个循环,即最小执行单位,只要搞懂了他们的调用基本上就理解了,就能用递归的方法写出来。

其实此问题的基本情况是n=1.如果n==1,只需要简单的将唯一一个盘子从A移动到B。当n>1时,我们可以将原问题分为3个子问题,如下:

1.将上面n-1个盘子从A移动到C,B作为辅助

2.将最下面的n号盘子从A移动到B

3.将n-1个盘子从C移动到B


这个图是当n=3的递归调用,用来帮助理解

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值