目录:

  • 一、什么是递归
    • 1.先来看一下一个递归的例子
    • 2.递归的基本原理
  • 二、汉诺塔问题
    • 1.汉诺塔的故事
    • 2.回到编程,汉诺塔问题主要就是解决这个问题:
    • 3.怎么解决汉诺塔问题
      • 要解决汉诺塔问题就要用到递归思想,这里拿四层汉诺塔举例子:
    • 4.具体代码实现
      • 在这里可以创建一个Move方法来移动盘子
      • 现在要把大象装进冰箱了
        • 1. 把冰箱门打开
        • 2.把大象塞进去
        • 3.把门关上
    • 5. 完整代码

一、什么是递归

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

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

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

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

2.递归的基本原理

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

  1. 除了调用其他方法,方法也可以调用自身,这叫做递归
  2. 调用方法自身的机制和调用其他方法其实是完全一样的,都是为每一次方法调用把新的栈帧压入栈顶。

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

二、汉诺塔问题

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.具体代码实现

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

  1. 把冰箱门打开
  2. 把大象放进去
  3. 把冰箱门关上

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

  1. 把底层上面的盘子放到B柱
  2. 把最底层盘子放到C柱
  3. 把B柱那些盘子放到C柱

抽象一下就是:

  1. 把n-1层盘子从起点移到暂存区
  2. 然后把第n层盘子从起点移到终点
  3. 然后把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方法都有他自己的起点、暂存区和终点,我们只需要把上一层的起点、暂存区和终点传过去就行了。

5. 完整代码

以下是完整代码:

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#汉诺塔递归算法实现相关推荐

  1. 汉诺塔递归算法进阶_进阶python 1递归

    汉诺塔递归算法进阶 When something is specified in terms of itself, it is called recursion. The recursion give ...

  2. python汉诺塔_汉诺塔递归算法/搬金盘的婆罗门 - Python实现

    汉诺塔递归算法/搬金盘的婆罗门 - Python实现 版权声明 本文节选自作者本人的图书<Python编程基础及应用>,高等教育出版社.本文可以在互联网上自由转载,但必须:注明出处(作者: ...

  3. 汉诺塔递归算法/搬金盘的婆罗门 - Python实现

    汉诺塔递归算法/搬金盘的婆罗门 - Python实现 本文引用自作者编写的下述图书; 本文允许以个人学习.教学等目的引用.讲授或转载,但需要注明原作者"海洋饼干叔 叔":本文不允许 ...

  4. 汉诺塔-递归算法深入理解

    汉诺塔算法就3个步骤: 第一,把a上的n-1个盘通过c移动到b: 第二,把a上的最下面的盘移到c: 第三,因为n-1个盘全在b上了. 所以把b当做a重复以上步骤就好了.不过,思考过程还是很痛苦的,难以 ...

  5. python汉诺塔递归算法_Python文摘:汉诺塔问题与递归算法

    历史传说: 在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论白天黑夜 ...

  6. python汉诺塔递归算法流程图,python实现汉诺塔递归算法经典案例

    Python汉诺塔递归问题 python请用递归算法编程解决汉诺塔问题 在线等 关于python递归函数实现汉诺塔 def move(n,a,b,c): #1 if n==1: #2 print(a, ...

  7. python汉诺塔递归算法流程图_python实现汉诺塔的图解递归算法

    一.起源: 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小 ...

  8. python汉诺塔递归算法流程图_详解汉诺塔Python递归程序

    学习递归时,很多小伙伴对汉诺塔的递归算法非常疑惑,不清楚那么复杂的移动过程,为何用四五行代码就给解决了.汉诺塔问题:有三根柱子A,B,C.A柱上有若干碟子,每次移动一块碟子,小的只能叠在大的上面,把所 ...

  9. 对汉诺塔递归算法的理解(图解,附完整代码实现)

    前情提要: 首先说一下汉诺塔游戏的规则:如下图所示,有三个柱子A,B,C,我们要做的是把A柱的所有圆盘,全部转移到C柱上,转移时遵循的规则如下: 1.每次只能移动一个圆盘 2.所有的大圆盘必须在小圆盘 ...

  10. 汉诺塔 - 递归算法

    汉诺塔游戏规则描述: 有三根杆子star,station,end.star杆上有 N (>=1)个方块,方块尺寸由下(1)到上(n)依次变小.要求按下列规则将所有圆盘移至 end 杆: 每次只能 ...

最新文章

  1. 总结一下“网络连接受限制”无法上网的解决办法
  2. Mongo DB 2.6 需要知道的一些自身限定
  3. ES6中的rest参数
  4. java文件名要和什么一致,Java的类名与文件名必须一致
  5. 2021年Python十佳ML库大盘点,国产选手GitHub半年获5k+star,第一名是升级版NumPy
  6. 可靠数据传输原理1(构造可靠数据传输协议)
  7. qtdesigner 组件全吗_百度营销工具有哪些?带你了解百度全链路营销
  8. 新元素之video,audio,meter,datalist,keygen,output
  9. 行内元素和块状元素一览表
  10. hdu oj1096题解
  11. 物料编码原则有码还是无码
  12. 网站title实现切换
  13. Linux Centos7网络属性配置
  14. 步骤一:入门linux基础/01Linux简介和安装/003Linux系统的多面性
  15. 域控下发脚本_让系统及时的通过域用户脚本自动的打补丁
  16. 最齐全的骨头VRay材质球素材,速来收藏
  17. html图标隐藏,教你如何隐藏统计图标,两个隐藏统计图标的HTML代码
  18. Unity2D入门(二) 优化玩家移动手感(一)
  19. 获取华为云课程内嵌的课件pdf文件
  20. 8~mybatis的动态sql

热门文章

  1. Nmap-主机、端口扫描工具
  2. 【JavaSE基础 】Eclipse教程
  3. java程序启动端口_查看项目端口和启动情况
  4. reviewboard mysql_reviewboard安装实战
  5. AI 智能写作与智能写诗
  6. sis新地址_“这是什么梗?”,互联网上的新梗老梗如何影响你?
  7. ie11兼容性视图设置_ie11浏览器不兼容的解决办法
  8. 电脑垃圾,电脑垃圾怎么清理?电脑垃圾深度清理方法?
  9. 金蝶K3 webservice接口
  10. vmware 安装 mac os 修改序列号