递归分析汉诺塔问题

以下是图片文本         

*先明确思路(可将N想象成3便于理解)*
1.首先     想将N个圆盘全部从A移动到B  那么就一定要将最大的一个圆盘放在B的最底部   因此就需要将上面的  (N-1)个放在C上  
2.其次     当第N个圆盘移动到B后就需要考虑C上的圆盘移动到B的问题了
---------------  以上是思路  -----------------
    那么我们现在需要考虑的问题就是将C上的(n-1)个圆盘如何移动到B    是不是和原来的问题似曾相识  如果将    (n-1)==N    是不是就是重复了我们先前的思路就可以
---------------  以上是分析   ----------------
(H(N)表示将一个柱子上的N个圆盘移动其他柱子上需要的次数)
现在我们将N==3,用我们的思路进行考虑将  3个圆盘从A移动到B  所要用的次数用  H(3) 表示  分解这个问题           1.我们需要将最上面的2个圆盘移动到C    次数不就可以用 H(2)表示  2.我们要将原来最下面的圆盘放在B  次数将+1   3.将已经移动到C上的圆盘移动到B 次数+H(2)
经过以上分析H(3)=H(2)+1+H(2);
        同理H(2)=H(1)+1+H(1);
        我们已经明确知道H(1)==1;问题解决
进行整理可得H(N)=2*H(N-1)+1;
递归就可以进行了   

以下是代码实现

//代码实现汉诺塔递归
int digui(int a)
{
	if (a>1)
	{
		return 2 * digui(a - 1) + 1;
	}
	else if(a==1)
	{
		return 1;
	}
}
int main()
{
	int a = 0;
	scanf("%d", &a);
	int ret = digui(a);
	printf("%d", ret);
	return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值