C#中汉诺塔问题的递归解法

简介: 百度测试部2015年10月份的面试题之——汉诺塔。 汉诺塔就是将一摞盘子从一个塔转移到另一个塔的游戏,中间有一个用来过度盘子的辅助塔。 百度百科在此。 游戏试玩在此。 用递归的思想解决汉诺塔问题就是分为两种情况: 第一种情况是只有一个盘子的情况,也就是最基本的情况,这种情况下,直接将该盘子从原始塔转移到目标塔即可胜利; 第二种情况是右n个盘子的情况,也就是普遍情况,这种情况下,要将除了最底下的那个盘子以外的(n-1)个盘子从原始塔转移到辅助塔,再把最底下的那个盘子(第n个盘子)从原始塔转移到目标塔,最后将辅助塔的(n-1)个盘子从辅助塔转移到目标塔。

百度测试部2015年10月份的面试题之——汉诺塔。

汉诺塔就是将一摞盘子从一个塔转移到另一个塔的游戏,中间有一个用来过度盘子的辅助塔。

百度百科在此

游戏试玩在此

用递归的思想解决汉诺塔问题就是分为两种情况:

第一种情况是只有一个盘子的情况,也就是最基本的情况,这种情况下,直接将该盘子从原始塔转移到目标塔即可胜利;

第二种情况是右n个盘子的情况,也就是普遍情况,这种情况下,要将除了最底下的那个盘子以外的(n-1)个盘子从原始塔转移到辅助塔,再把最底下的那个盘子(第n个盘子)从原始塔转移到目标塔,最后将辅助塔的(n-1)个盘子从辅助塔转移到目标塔。

而第二种情况中(n-1)个盘子的问题又可以拆分成(n-2)个盘子和一个盘子的问题——

而(n-2)个盘子的问题又可以拆分成(n-3个情况)和一个盘子的问题——

……

最终可以拆分成(n-(n-1))个盘子的问题,也就是一个盘子的问题,这时候问题就变成了第一种情况——

将这个盘子从原始塔转移到目标塔即可。

以上就是递归的思想在解汉诺塔游戏中的应用,我们可以理解这种递归法为类似数学归纳法的逆向思维法:

数学归纳法是一种从问题最基本情况的求解过程通过找规律从而得出该问题普遍情况的求解过程的方法;

递归法是将对问题普遍情况的求解过程进行拆分,最后分解为对一种最基本情况的求解过程的方法。

通过递归法解决汉诺塔的移动顺序问题代码如下:

using System;

namespace HanoiTower
{
    class Program
    {
        static void Main(string[] args)
        {
            int n = Int32.Parse(Console.ReadLine());
            Hanoi(n,"TowerA","TowerB","TowerC");
            Console.ReadLine();
        }

        private static void Hanoi(int n, string origin, string temp, string destination)
        {
            if (n == 1)
            {
                move(origin, destination);
            }
            else
            {
                Hanoi(n - 1, origin, destination, temp);
                move(origin, destination);
                Hanoi(n - 1, temp, origin, destination);
            }
        }

        private static void move(string origin, string destination)
        {
            Console.WriteLine("Move the plate from " + origin + " to " + destination);
        }
    }
}

运行结果如下(以三个盘子的情况为例,大家可以去游戏中操作来验证解的正确性):

相关文章
|
C# 机器学习/深度学习
C#中八皇后问题的递归解法——N皇后
百度测试部2015年10月份的面试题之——八皇后。 八皇后问题的介绍在此。以下是用递归思想实现八皇后-N皇后。 代码如下: using System;using System.Collections.
1163 0
|
1月前
|
C#
24. C# 编程:用户设定敌人初始血值的实现
24. C# 编程:用户设定敌人初始血值的实现
18 0
|
2月前
|
SQL 数据库连接 应用服务中间件
C#WinForm基础编程(三)
C#WinForm基础编程
71 0
|
2月前
C#WinForm基础编程(二)
C#WinForm基础编程
55 0
|
2月前
|
C# 数据安全/隐私保护
C#WinForm基础编程(一)
C#WinForm基础编程
59 0
|
4月前
|
数据采集 前端开发 C#
C#编程艺术:Fizzler库助您高效爬取www.twitter.com音频
Twitter是全球最大的社交媒体平台之一,包含丰富的音频资源。用户可以在Twitter上发布、转发、评论和收听各种音频内容,如音乐、播客、新闻、故事等,直接从Twitter抓取音频数据并非易事,尤其是在考虑到可能的封锁和反爬虫机制。Twitter会对频繁访问的IP地址进行限制或封禁,以防止恶意爬虫的行为。因此,我们需要使用一些技术手段来规避这些障碍,确保稳定而高效的数据访问。
C#编程艺术:Fizzler库助您高效爬取www.twitter.com音频
|
3月前
|
程序员 C#
深入理解 C# 编程:枚举、文件处理、异常处理和数字相加
枚举是一个特殊的“类”,表示一组常量(不可更改/只读变量)。 要创建枚举,请使用 enum 关键字(而不是 class 或 interface),并用逗号分隔枚举项:
37 0
|
3月前
|
定位技术 C# 图形学
Unity和C#游戏编程入门:创建迷宫小球游戏示例
Unity和C#游戏编程入门:创建迷宫小球游戏示例
71 2
|
4月前
|
C# C++
C# 高效率编程 “多线程” 的基本使用
C# 高效率编程 “多线程” 的基本使用
|
6月前
|
开发框架 .NET 数据库
asp.net企业费用报销管理信息系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio
asp.net 企业费用报销管理信息系统是一套完善的web设计管理系统,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为vs2010,数据库为sqlserver2008,使 用c#语言开发 应用技术:asp.net c#+sqlserver 开发工具:vs2010 +sqlserver
49 0