以下是图片文本
*先明确思路(可将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;
}