汉诺塔详解!C语言

汉诺塔移动规则;

有三根杆子A,B,C。A杆上有 N 个 (N>1) 穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至 C 杆:

  1. 每次只能移动一个圆盘;
  2. 大盘不能叠在小盘上面。

可以将圆盘临时置于 B 杆,也可将从 A 杆移出的圆盘重新移回 A 杆,但都必须遵循上述两条规则。

解决汉诺塔问题的关键在于找到汉诺塔的规则

我们先从一层汉诺塔来看

只有一层的时候我们只需要直接移动到c上面就可(1步)

 当有2层的时候,我们要先将上面的移动到B,再将下面的移动到C,然后再将B上的移动到C上(3步)

 当有三层的时候,我们需要先将粉色和蓝色的移动到B上,然后将绿色的移动到C上,然后再将蓝色和粉色移动到C上(7步)

 

 那么以此类推,我们可以找出一定的规律

层数步数规律
112^1 - 1
22

2^2 - 1

372^3 - 1
4152^4 - 1

 我们发现步数是由2^层数减1得到的

代码(非递归)

#include <math.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	printf("完成%d层hanoi的步数:%d", (int)(pow(2, n) - 1));//注意包含头文件<math.h>

	return 0;
}

我们再来研究如何用递归的方式完成这个代码

通过规律我们可以看出

第一步就是先将(n-1)层通过C移动到B上

第二步就是将n(底下最大的一层)移动到C上面

第三步就是将(n-1)通过A移动到C上

所以我们可以得到一个公式F(n-1) + 1+F(n-1)

即2*F(n-1)+ 1

代码(递归)

#include <stdio.h>

int Hanio(int n)
{
	if (1 == n)
		return 1;
	else
		return 2 * Hanio(n - 1) + 1;
}
int main()
{
	int n = 0;
	scanf("%d", &n);//塔数
	int ret = Hanio(n);
	printf("完成%d层的汉诺塔需要%d步\n", n, ret);
	return 0;
}

运行结果:

  • 15
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南山忆874

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值