Python递归实现经典汉诺塔问题

汉诺塔

汉诺塔介绍

  • 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。汉诺塔

递归

  • 函数直接或者间接地调用自己。是编程中常用的思想,简化代码编写,加重CPU负担的一个典型的以资源换方便的方法

思路以及实现

思路

  • 先考虑一个盘子的情况,直接A–>C
  • 再考虑两个盘子的情况,A–>B,A–>C,B–>C
  • 然后考虑三个盘子的情况,把最底下一个盘子当成不存在,那么问题又变为两个盘子的情况,具体做法是将上面两个盘子全部移动到B,再把最大的盘子移到C,然后把B当成两个盘子情况下的A,再重复两个盘子的方法,解决
  • 最后想下四个盘子的情况,同样把最底下的盘子当成不存在,我们要把上面3个盘子移动到B,那么就是三个盘子的情况,三个小的移动到B之后,把最大的从A–>C,然后再把B当成A继续重复第三种情况的做法,递归解决

代码实现

    #  @Intro: 汉诺塔
    #  A,B,C三个支架子,A上放了从下往上从大到小的盘子
    #  现在要求把A上的盘子移动到C上,B可以作为中间暂时放置的媒介
    #  但是在移动的过程中必须遵守小盘子必须在大盘子上面,且每次只能移动一个盘

    a = 'A'
    b = 'B'
    c = 'C'
    def hanot(a, b, c, n):
        if n == 1:
            print('{}-->{}'.format(a, c))
            return None
        if n == 2:
            print('{}-->{}'.format(a, b))
            print('{}-->{}'.format(a, c))
            print('{}-->{}'.format(b, c))
            return None
        #a借助c将n—1个盘子移动到b上,然后把最大的从a到c
        hanot(a, c, b, n - 1)
        print('{}-->{}'.format(a, c))
        #b借助a将n - 1个盘子全部移动到c上,完成,以此进行递归算法
        hanot(b, a, c, n - 1)
        
	# 测试3个盘子的情况
	hanot(a, b, c, 3)
  • 结果输出
A-->C
A-->B
C-->B
A-->C
B-->A
B-->C
A-->C

后续思考

  • 在某些情况下,我们无法用递归实现汉诺塔问题,比如操作机器手臂来搬运汉诺塔的盘子,实际上机械手臂很可能是无法用递归来进行操作的,因为递归是自顶向下分解和自下向上回溯的过程
  • 那么我们必须通过算法,一步一步分解动作实现汉诺塔的操作
  • 不使用递归的汉诺塔问题实现比较复杂,以后我们慢慢呈现
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读