美文网首页
简单理解汉诺塔递归问题(Python)

简单理解汉诺塔递归问题(Python)

作者: Oywddhr | 来源:发表于2019-08-13 13:29 被阅读0次

废话不多说,先上代码:

def Hanoi(n, a, b, c):

    if n == 1:

        print(a, '-->', c)

    else:

        Hanoi(n-1, a, c, b)

        Hanoi(1, a, b, c)

        Hanoi(n-1, b, a, c)

Hanoi(3, 'A', 'B', 'C')

执行结果(以n=3为例):

A --> C

A --> B

C --> B

A --> C

B --> A

B --> C

A --> C

函数Hanoi(n, a, b, c)中的n表示汉诺塔第一根柱子(起始柱子)上有多少个圆盘,a、b、c所在的参数位置(注意是位置)可以分别理解为起始柱子、过度柱子、目标柱子。

首先,我们需要明确业务方法(汉诺塔的解法思路),概括一下就是“想方设法绕路过去”,即很多时候都需要借助“过度柱子”来达到目的(从起始柱子移到目标柱子)。

再说递归,其含义概括为“在函数内部调用其自身本身”,视觉上就像两个镜子在不断地重复镜像。递归在理解上重结果,轻过程,用于解汉诺塔问题简直完美。

下面,拆解代码进行详解:

if n == 1:

    print(a, '-->', c)

这是递归函数的临界值(告诉递归函数什么时候该停止调用自身),这里可以理解为当起始柱子上只有一个圆盘时(递归最里面的那一层),把圆盘从起始柱子直接移动到目标柱子(不一定是“A --> C”。实际上,当n是奇数时,临界值输出为“A --> C”;当n是偶数时,输出为“A --> B”)

至于Hanoi(n-1, a, c, b),这里的思路是,不管圆盘有多少个(除非只有1个),都理解成最下面那个最大的1个圆盘和上面的n-1个圆盘两部分。

第一步:Hanoi(n-1, a, c, b)

n-1个圆盘那部分,由起始位置a,经过过度位置c,移到目标位置b

第二步:Hanoi(1, a, b, c)

1个圆盘那部分(最大的那个),由起始位置a,移到目标位置c(需注意这里没有过度位置了,因为n=1,就直接移动,并且位置b已经被上一步占用了)

第三步:Hanoi(n-1, b, a, c)

n-1个圆盘那部分,由起始位置b,经过过度位置a,移到目标位置c

看结果逻辑似乎无比清晰,但是感觉函数中间一层一层的递归还是一团乱麻啊。不过递归就是这样,只要确定好临界值和递归逻辑,过程就装进黑盒子吧。

相关文章

  • Python3 趣味系列题4 ------非递归解决

      人们通常利用递归的方法求解汉诺塔问题。递归程序的实现比较简单,但是难于理解。下面给出python3的递归程序:...

  • 简单理解汉诺塔递归问题(Python)

    废话不多说,先上代码: def Hanoi(n, a, b, c): if n == 1: print...

  • 数据结构算法之递归和栈结构

    递归 程序调用自身的编程技巧称为递归简单案例:n的阶乘 汉诺塔 汉诺塔问题描述:3个柱为a、b、c,圆盘最初在a柱...

  • 算法学习 - Python(持续更新)

    二分查找法 - 递归实现 约瑟夫环问题 汉诺塔问题(递归) 旋转列表(Python):列表原地修改,参考Leetc...

  • 算法学习

    算法学习 递归 调用自身终止条件 汉诺塔问题 python实现: def hanoi(n, a, b, c):if...

  • 递归:汉诺塔问题(简单)

    在经典汉诺塔问题中,有 3 根柱子及 N 个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自上而...

  • 数据结构与算法-递归分治-汉诺塔思想

    折半查找算法的递归实现 思想:减少查找序列的长度,分而治之地进行关键字的查找 汉诺塔问题 汉诺塔是我们递归思想,分...

  • Python 汉诺塔的实现

    汉诺塔的实现,是一个典型的递归问题,当然越是复杂的递归问题越是考验人的抽象思维; 哈哈哈,言归正传,汉诺塔问题如下...

  • 2.22学堂在线python笔记,递归

    @[TOC](2.22学堂在线python笔记,递归) # 知识点 1. 汉诺塔问题为了计算实际上移动整个塔到另一...

  • 理解汉诺塔递归

    三个盘子的汉诺塔你总会吧: 然后你移完发现左边柱子下面又蹦出来一个盘子 好吧, 那就把中间的柱子看成目标柱 然后把...

网友评论

      本文标题:简单理解汉诺塔递归问题(Python)

      本文链接:https://www.haomeiwen.com/subject/mqsvjctx.html