笨人小白的温故知新——递归(6)

1205:汉诺塔问题


这是一道很经典的题。当然,我一开始也没有做出来,但是!我当时发现了一些规律!只是当时不知道怎么表达而已(傲娇)。

下图,是汉诺塔问题的抽象模型。

汉诺塔抽象模型

我的发现:

1)因为,小环必须在大环的上面,所以,肯定要借助一根柱子当作“缓停点”。即:我from这里to那里,必须要借助一个aux柱缓一缓。

2)b柱和c柱会在每进行一次“将a柱上的小环拿下放在已排列好的柱上”这一过程中,充当那个“一排列好的柱”,所以,要想让b柱当最后的“已排列好的柱”,在前一个环排列好时,c柱充当的是“已排列好的柱”。

唉~这不就好办了吗。

这道题很明显是个递归问题。那么,我们就按照递归的三大条件,来定义这个hanoi叭~

1)要移出a柱上的第n个环,我们要在移出第n-1的基础上,移第n个环;

2)当然,当移第0个环的时候,就是初始状态,函数就应当停止;

下面是AC代码:

#include <iostream>

using namespace std ;

void hanoi(int n , char from , char to , char aux){
	if (n == 0) return ;
	hanoi(n-1 , from , aux , to) ;
	printf("%c->%d->%c\n", from , n , to) ;
	hanoi(n-1 , aux , to , from) ;
}
int main(){
	int n ;
	char a , b , c ;
	cin >> n >> a >> b >> c ;
	hanoi(n , a , b , c) ;
	return 0 ;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值