汉诺塔(Tower of Hanoi)--------递归思路

汉诺塔问题简介:

有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移到柱子C上,并且每次移动,同一根柱子上都只能是大盘子在下,小盘子在上,请问至少需要多少次移动?

汉诺塔问题分析:

1.     若只有1个圆盘,就只需要移动 1 次,即 A → C;

2.     若有两个圆盘,则需要移动 3 次,即 A→B,A→C,B→C;

 3.    若有三个圆盘,则需要移动 7 次,即 A→ C,A→ B,C→ B,A→ C,B→ A,B→ C,A→ C

依此类推.......

汉诺塔问题的递归思路:

将 n 个圆盘分为 n-1 (即除最低层的圆盘)与 1 (即最底层的圆盘),将n-1个圆盘移动到中转位置,将1移动到目的位置,再将 n-1 分为 (n-1)- 1 与 1,将(n-1)- 1 移动到中转位置,将1移动到目的位置,依次类推......

代码如下:

#include<stdio.h>
//打印每一步的操作
void move(char a, char b)
{
	printf(" %c -> %c ", a, b);
}
//n:有几个盘子
//a:起始位置
//b:中转位置
//c:目的位置
void hbt(int n, char a, char b, char c)
{
	if (n == 1)
		move(a, c);
	else//n>=2时
	{
		hbt(n - 1, a, c, b);
        //此时n-1的起始位置是a,中转位置是c,目的位置是b
		move(a, c);
        //将 1 从起始位置 a 移动到目的位置 c
		hbt(n - 1, b, a, c);
        //将 n-1 从起始位置 b,通过中转位置a,移动到目的位置 c
	}

}
int main()
{
	hbt(3, 'A', 'B', 'C');
    //3就代表有3个盘子,可修改
	return 0;
}

 图示如下:

 注意:这里的起始位置,中转位置和目的位置是相对的,最终是要将圆盘从A移到C!!!!!!

  • 23
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一叶祇秋

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

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

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

打赏作者

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

抵扣说明:

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

余额充值