汉诺塔问题细讲——谈谈菜鸟对递归的理解

*汉诺塔问题可以分解为两种情况
1,a上只有一个木块:只需将a->c。
{
if(n==1)
cout<<a<<"->"<<c<<endl;
}
2,a上有n个木块:汉诺塔既然是递归问题,递归问题一般都是从最后一步分析往前分析。
首先,如何搬运最后一块n?
那么需要把n上的n-1块从a上搬运到中间b上,
然后把第n块从a搬运到c上,
最后把b上的n-1块再搬运到c上即可。
(可能有些同学会疑惑,汉诺塔每次只能移动一个木块,如何将n-1块从a搬运到b呢,这就是递归,只需调运你之前根据规律编写的汉诺塔函数,就能完成。你只需要把原来的中间b看成你要搬运到最终点的c,c反而起到了原本b过度的作用(b与c互换即可 :hlt(n-1,a,c,b);同理,把n-1块从b再搬运到a是一样的)

#include <iostream>
using namespace std;
void hlt(int n,char a,char b,char c)
{
 if(n==1)
  {cout<<a<<"->"<<c<<endl;
 return;}
 hlt(n-1,a,c,b);//那么需要把n上的n-1块从a上搬运到中间b上,
 cout<<a<<"->"<<c<<endl;//然后把第n块从a搬运到c上,
 hlt(n-1,b,a,c);//最后把b上的n-1块再搬运到c上即可。
 return ;
}
int main()
{
 int n;
 cin>>n;
 hlt(n,'a','b','c');
 return 0;
}

各位朋友大家好,第一次写博客,有点小激动,身为萌新经常上CSDN看各位大佬写的博客,觉得它可以记录自己成长,分享自己对问题的理解,总之对自己很有帮助。希望能和大家一起成长。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值