初识汉诺塔问题

问题:对于A B C 三个塔,使盘子从A到C,并且保持大盘子在下小盘子在上,求移动多少次?

方法:递归解决

思考:1.对于1个盘子直接从A放到C。

           2. 对于2个盘子,第一个先从A到B,然后第二个再从A到C,然后再让第一个从B到C。

           3.对于A中n个盘子,前n-1个从A到B,然后第n个再从A到C;

                  对于B中n-1个盘子,前n-2个从B到​​​A,然后第n-1个再从B到C;

     …………然后递归ing…………

                   对于A中n-2个盘子…………

     …………直到结束条件…………

     对于A或B中1个盘子,直接从A或B到C。

(注意:类似于斐波拉奇数列,刚开始不用深究如何让n-1个盘子从A移动到B的,在一次一次向下迭代后,可以依次得到1、2、3……个盘子从一个塔移动到另一个塔的移动次数)

C语言代码表示:

#include<stdio.h>

int hrt(int n)
{
	if (n == 1)
		return 1;
	else if (n <= 0)//当盘数<=0时,不需要移动
		return 0;
	else/*A->B移n-1个的次数+A->C移第n个+B->A移n-2个的移动次数+B->C移第n-1个*/
		return hrt(n - 1) + 1 + hrt(n - 2) + 1;

}
int main()
{
	int n;
	scanf("%d", &n);
	printf("%d", hrt(n));

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值