堆栈思想案例—汉诺塔问题求解最小步数


前言

汉诺塔是一款有趣的智力游戏,其求解问题在数据结构与算法中也是堆栈思想和递归思想的典型案例。


一、何为汉诺塔

图片来自百度

如图所示:有A、B、C三个杆,A杆上放有自上而下直径依次递增的圆盘,要将所有圆盘从A杆移动到C杆,并保持原来的叠放顺序,圆盘的放置可借助B杆,搬动时还需遵守以下规则:
1、直径较小的圆盘永远只能置于直径较大的圆盘之上。
2、圆盘可以任意的从任何一个木桩移动到其他的木桩上。
3、每次只能移动一个圆盘,而且只能从木桩最上面的开始移动。

二、问题分析

设有n个圆盘,对于汉诺塔的最小步数求解,进行一层抽象,无非是三个步骤:

1、将n - 1个圆盘,从A杆移动到B杆。
2、将第n个,即最大的圆盘,从A杆移动到C杆。
3、将n - 1个圆盘,从B杆移动到C杆。

当第n个圆盘移动到C杆,我们可以将B杆视为A杆,A杆视为B杆,重复步骤,因为此时第n个圆盘到达了目标位置,而前n - 1个圆盘都可放置于第n个圆盘之上,就可将归位的第n个圆盘视为无。

借助B杆,将第n个圆盘从A杆移动到C杆所需的最小步数为2n-1,依次类推,求解的最小步数就是一个等比数列的求和,解为2n - 1。

三、算法实现

代码如下(C#实现):

//求解汉诺塔问题中,移动n个圆盘的最少步骤过程
static void Hanoi(int n, string A = "A", string B = "B", string C = "C")
{
	if(n == 1)
	{
    	Console.WriteLine($"从{A}杆移动到{C}杆");
    }
    else
    {
    	Hanoi(n - 1, A, C, B);
        Console.WriteLine($"从{A}杆移动到{C}杆");
        Hanoi(n - 1, B, A, C);
        }
    }
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值