iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#利用递归算法解决汉诺塔问题
  • 503
分享到

C#利用递归算法解决汉诺塔问题

2024-04-02 19:04:59 503人浏览 独家记忆
摘要

目录一、什么是递归二、汉诺塔问题1.汉诺塔的故事2.解决思路3.怎么解决汉诺塔问题4.具体代码实现三、完整代码一、什么是递归 方法调用自己的行为就是递归,递归必须要有终止条件,不然它

一、什么是递归

方法调用自己的行为就是递归,递归必须要有终止条件,不然它会无限递归。

1.先来看一下一个递归的例子

此程序的Fact方法从大到小地一级一级地调用自己,直到参数为1,然后就开始返回一级一级的从小到大地累乘,然后就计算出number的阶乘了。

static int Fact(int num)
{
    if (num <= 1)
    {
        return num;
    }
    else
    {
        return num * Fact(num - 1);//调用自己,这一步是关键
    }
}

2.递归的基本原理

以下是《C#图解教程》对于递归的描述:

除了调用其他方法,方法也可以调用自身,这叫做递归。

调用方法自身的机制和调用其他方法其实是完全一样的,都是为每一次方法调用把新的栈帧压入栈顶。

我个人认为递归就是把你要干的事情抽象一个成可以有限步数解决的方法,然后某一步解决不了就再调用这个方法,直到可以解决(结束递归的条件)这个问题就返回。

下面再看一个具体的例子来了解递归。

二、汉诺塔问题

1.汉诺塔的故事

汉诺塔由法国数学家爱德华·卢卡斯创造,他曾经编写了一个印度的古老传说:

在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。

2.解决思路

回到编程,汉诺塔问题主要就是解决这个问题:

有A、B、C三根针,A上从小到大放着n层盘子,要从A上所有的盘子移动到C盘上。

条件是一次只能移动一个盘子,无论什么时候小盘子必须在大盘子上面。

汉诺塔问题求的是把盘子从A移到C总共的移动次数是多少。

这是我之前追踪4层汉诺塔运行步骤画的笔记

事实证明,没多大帮助。

要想理解递归必须要放弃理解递归,放弃跟踪全程步骤。

解决问题是计算机的事,你只要明确要把每一步怎么传给计算机,递归两层之间怎么交接,以及递归结束的条件就可以。

3.怎么解决汉诺塔问题

要解决汉诺塔问题就要用到递归思想,这里拿四层汉诺塔举例子:

要完成四层汉诺塔,需要先把第四层盘子从A柱放到C柱,而要把第四层盘子放到C柱,就要把上面三层的盘子放到B柱:

那么要把这三层盘子移到B柱,那么就要先把第三层盘子移到B柱。

要把第三层盘子移到B柱,就要把第二层盘子移到C柱子。

要把第二层盘子移到C柱,就要把第一层盘子移到B柱子。

移动一层汉诺塔到另一个柱不简单吗?

这样子把问题解决了,第四层盘子就可以移动到C柱上了。

然后把剩下的三层汉诺塔也按照上面的思想,就可以移动到C柱上了。

视频链接

4.具体代码实现

把大象装进冰箱需要多少步

  • 把冰箱门打开
  • 把大象放进去
  • 把冰箱门关上

把汉诺塔放到C柱需要多少步

  • 把底层上面的盘子放到B柱
  • 把最底层盘子放到C柱
  • 把B柱那些盘子放到C柱

抽象一下就是:

把n-1层盘子从起点移到暂存区

然后把第n层盘子从起点移到终点

然后把n-1层盘子从暂存区移到终点

在这里可以创建一个Move方法来移动盘子

static void Move(int pile, char src, char tmp, char dst)
{
​​​​​​​}

src就是源起点,tmp就是暂存区,dst就是终点

最外层的Move方法完成的是把pile层汉诺塔从src经过tmp移动到dst

现在要把大象装进冰箱了

在Move方法里面调用Move方法来解决之后的问题:

1. 把冰箱门打开

Move(pile - 1, src, dst, tmp);

这层Move完成的是把pile-1层汉诺塔从src经过dst移动到tmp

2.把大象塞进去

Move(1, src, tmp, dst);

这层Move完成的是把最底层汉诺塔盘子从src直接移动到dst

3.把门关上

Move(pile - 1, tmp, src, dst);

这层Move完成的是把pile-1层汉诺塔从tmp经过src移动到dst

Move方法完整代码:

static void Move(int pile, char src, char tmp, char dst)
        {
            if (pile == 1)//pile=1问题就好解决了
            {
                Console.WriteLine($"{src} --> {dst}");
                steps++;
                return;
            }
            Move(pile - 1, src, dst, tmp);
            Move(1, src, tmp, dst);
            Move(pile - 1, tmp, src, dst);
        }

每一层Move方法都有他自己的起点、暂存区和终点,我们只需要把上一层的起点、暂存区和终点传过去就行了。

三、完整代码

以下是完整代码:

using System;

​​​​​​​namespace Hanoi
{
    class Program
    {
        public const int MAX_VALUE = 30;//声明最大值常量
        public static int steps = 0;
        static void Main(string[] args)
        {
            int levels = 0;
            Console.Write($"输入汉诺塔层数(1~{MAX_VALUE}): ");
            levels = int.Parse(Console.ReadLine());
            if (levels > 0 && levels < MAX_VALUE)
            {
                Move(levels, 'A', 'B', 'C');
                Console.WriteLine($"一共移动了{Program.steps}次。");
                Console.ReadKey();
                return;
            }
            Console.WriteLine("输入范围错误");
            Console.ReadKey();
        }
        static void Move(int pile, char src, char tmp, char dst)
        {
            if (pile == 1)//pile=1问题就好解决了
            {
                Console.WriteLine($"{src} --> {dst}");
                steps++;
                return;
            }
            Move(pile - 1, src, dst, tmp);
            Move(1, src, tmp, dst);
            Move(pile - 1, tmp, src, dst);
        }
    }
}

运行结果如下:

到此这篇关于C#利用递归算法解决汉诺塔问题的文章就介绍到这了,更多相关C#汉诺塔递归算法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C#利用递归算法解决汉诺塔问题

本文链接: https://www.lsjlt.com/news/147300.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C#利用递归算法解决汉诺塔问题
    目录一、什么是递归二、汉诺塔问题1.汉诺塔的故事2.解决思路3.怎么解决汉诺塔问题4.具体代码实现三、完整代码一、什么是递归 方法调用自己的行为就是递归,递归必须要有终止条件,不然它...
    99+
    2024-04-02
  • C#怎么利用递归算法解决汉诺塔问题
    本篇内容介绍了“C#怎么利用递归算法解决汉诺塔问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、什么是递归方法调用自己的行为就是递归,递...
    99+
    2023-06-30
  • Java用递归方法解决汉诺塔问题详解
    目录前言一、问题描述二、问题分析三、解决方案四、示例前言 博主之前有写过关于递归问题的思维模式: 递归的思路 下面将用这种思维模式来求解经典汉诺塔问题。 一、问题描述 汉诺塔(又称河...
    99+
    2024-04-02
  • C语言递归:汉诺塔问题分析
    目录问题背景游戏体验汉诺塔移动次数规律移动过程的深层解读汉诺塔问题的三步过程归纳图解:发现:代码实现1仅打印移动次数代码实现2打印移动的具体过程补充问题背景 汉诺塔问题源自印度一个古...
    99+
    2023-01-28
    c语言递归汉诺塔 C语言递归汉诺塔每一步详解 汉诺塔c程序的递归原理
  • 递归——汉诺塔问题(python实现)
    规则 每次移动一个盘子 任何时候大盘子在下面,小盘子在上面 方法 假设共n个盘子 当n=1时: 直接把A上的一个盘子移动到C上(A->C) 当n=2时: 把小盘子从A放到B上(A->B)这里开始采用参数,rsc源...
    99+
    2023-01-30
    递归 汉诺 python
  • C语言递归函数与汉诺塔问题怎么解决
    今天小编给大家分享一下C语言递归函数与汉诺塔问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。递归函数直接或者间接调...
    99+
    2023-07-02
  • C语言超详细讲解递归算法汉诺塔
    目录题目描述画图分析思路总结代码实现总结题目描述 汉诺塔问题起源于一个传说 汉诺塔又被称为河内塔,传说,在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。 印度教...
    99+
    2024-04-02
  • java基于递归算法实现汉诺塔问题实例
    本文实例讲述了java基于递归算法实现汉诺塔问题。分享给大家供大家参考,具体如下:package test;import java.util.List;import java.util.ArrayList;import java.util....
    99+
    2023-05-31
    java 递归算法 汉诺塔
  • C语言编程递归算法实现汉诺塔
    汉诺塔 法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下...
    99+
    2024-04-02
  • JavaSE递归求解汉诺塔问题的思路与方法
    目录1. 汉诺塔的介绍和玩法2. 汉诺塔问题的思路3. 用递归的代码实现 总结1. 汉诺塔的介绍和玩法 汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古...
    99+
    2022-11-13
    javase递归求解汉诺塔 用递归求解汉诺塔问题 递归实现汉诺塔问题java
  • Java通过递归算法解决迷宫与汉诺塔及八皇后问题
    目录1.递归的重要规则2.递归的三个案例1.老鼠出迷宫2.汉诺塔3.八皇后1.递归的重要规则 在执行一个方法时,就创建一个新的受保护的独立空间(栈空间)。方法的局部变量时独立的,不会...
    99+
    2024-04-02
  • C语言递归函数与汉诺塔问题简明理解
    目录递归函数Hanio(汉诺塔)问题递归函数 直接或者间接调用函数本身。“自己调用自己” 什么情况下面可以使用递归呢 解决一个问题时,解决思路化成与问题本身类...
    99+
    2024-04-02
  • Java怎么通过递归算法解决迷宫与汉诺塔及八皇后问题
    本篇内容介绍了“Java怎么通过递归算法解决迷宫与汉诺塔及八皇后问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.递归的重要规则在执行一...
    99+
    2023-06-30
  • C语言递归之汉诺塔和青蛙跳台阶问题
    递归就是一个函数执行过程中调用自己,在c语言中有很多关于递归的经典问题,例如:斐波那契数列问题、汉诺塔问题等,在研究递归问题时我们要注意三点: 1.递归的结束条件 2.递归在每次进行...
    99+
    2024-04-02
  • C语言用递归函数实现汉诺塔
    目录汉诺塔(Hanoi)是什么?那么,C语言如何实现汉诺塔呢?汉诺塔的基本思路是:具体代码见下(注意点在代码下面):总结汉诺塔(Hanoi)是什么? 一个简单的汉诺塔就如上图所示...
    99+
    2024-04-02
  • Java与C++分别用递归实现汉诺塔详解
    目录1.汉诺塔介绍2.解塔步骤3.C++实现(递归结果及显示步骤)(1)递归结果(2)显示步骤4.Java实现(递归结果及显示步骤)(1)递归结果(2)显示步骤1.汉诺塔介绍 汉诺...
    99+
    2024-04-02
  • c语言汉诺塔问题怎么解决
    解决汉诺塔问题的常见方法是使用递归。以下是使用递归解决C语言汉诺塔问题的示例代码:```c#include void hanoi(i...
    99+
    2023-10-07
    c语言
  • C语言递归思想实现汉诺塔详解
    目录1.递归思想简介2.汉诺塔问题3.汉诺塔递归的c语言实现总结1.递归思想简介 在c语言中,程序调用自身的编程技巧称为递归( recursion)。 递归的定义看上去似乎很抽象,使...
    99+
    2024-04-02
  • JavaScript中递归函数解“汉诺塔”算法的示例分析
    小编给大家分享一下JavaScript中递归函数解“汉诺塔”算法的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!“汉诺塔...
    99+
    2024-04-02
  • C语言运用函数的递归实现汉诺塔
    目录1、汉诺塔是如何实现的2、汉诺塔问题画图详解3、汉诺塔问题代码解释总结1、汉诺塔是如何实现的 下面是有三个盘子的示例: 从左到右一次是 A柱 B柱 C柱 A柱:起始位置 B柱:...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作