使用Python递归函数实现汉诺塔游戏,及代码运行步骤详解

废话少说,代码如下

1 def move(n, a='A', b='B', c='C'):
2    if n == 1:
3        return print(a, "->", c)
4    else:
5    move((n-1), a, c, b)
6    print(a, "->", c)
7    move((n-1), b, a, c)
8
9 move(3)
  • 最近在廖雪峰的网站学习Python,被汉诺塔的几行代码卡住了,知其然却无法知其所以然,网上找了很久也没找到一个真正能说清楚的,困扰了整整一天才相通其中关键,所以为了让像我一样的新手可以尽快理解少浪费些时间,专门抽空写了这篇文章,希望可以帮到大家。
  • 第6行print(a, "->", c)可以写做move(1, a, b, c),但是个人觉得分十分没有必要,既然都是一样的效用还是让代码少跑两步的好。
  • 为了让和我一样同为新手的朋友可以看懂,所以写的略啰嗦了一些。

开始运行move( 3 )

  • move 函数代入( n = 3 )参数: (3, a='A', b='B', c='C')

第一步 执行 ‘行2 - 3’ if n == 1:......

  • n != 1, ‘行2 - 3’ 越过

第二步 执行 ‘行4’else:

  • 执行 ‘行5’, 第一次递归开始,((n-1), a, c, b)回到函数最初代入(3, a='A', b='B', c='C'),得出参数为(2, 'A', 'C', 'B'),【!注意: 此时‘行1 ’(3, a='A', b='B', c='C')在 ‘行5’ 递归回到函数最初运行后已改变为(2, a='A', b='C', c='B')
    • 执行 ‘行2 - 3’ ,n != 1, ‘行2 - 3’ 越过
      • 执行else:
        • 执行 ‘行5’,将((n-1), a, c, b)代入(2, a='A', b='C', c='B'),得出参数为(1, 'A', 'B', 'C') ,继续执行 ‘行2 - 3’,n == 1 返回输出:(a, "->", c)代入(1, 'A', 'B', 'C') ,即 A -> C
        • 回到 ’ 行5‘,继续执行 ‘行6’ ,将(a, "->", c)代入move函数(2, a='A', b='C', c='B')并输出,即 A -> B
        • 执行 ’行7‘,将( (n-1), b, a, c)代入(2, a='A', b='C', c='B')得出参数为(1, 'C', 'A', 'B'),继续执行 ‘行2 - 3’,n == 1 返回输出:(a, "->", c)代入(1, 'C', 'A', 'B') ,即 C -> B

第三步 执行 ‘行6’ print(a, "->", c)

  • (a, "->", c)代入move函数(3, a='A', b='B', c='C')并输出,即*A -> C

第四步 执行 ‘行7’ move((n-1), b, a, c)

  • 执行 ‘ 行7’ ,第二次递归开始,((n-1), b, a, c)代入(3, a='A', b='B', c='C')得出参数为(2, 'B', 'A', 'C')【!注意: 此时 ‘行1 ’ (3, a='A', b='B', c='C')在 ‘行7’ 递归回到函数最初运行后已改变为(2, a='B', b='A', c='C')
    • 执行 ‘行2 - 3’ ,n != 1, ‘行2 - 3’ 越过
      • 执行`else:
        • 执行 ‘行5’,将((n-1), a, c, b)代入(2, a='B', b='A', c='C')得出参数为(1, 'B', 'C', 'A'),继续执行‘行2 - 3’,n == 1 返回输出:(a, "->", c)代入(1, 'B', 'C', 'A') ,即 B -> A
        • 回到 ’ 行5‘,继续执行 ‘行6’ ,将(a, "->", c)代入move函数(2, a='B', b='A', c='C')并输出,即 B -> C
        • 执行 ’行7‘,将((n-1), b, a, c)代入(2, a='B', b='A', c='C')得出参数为(1, 'A', 'B', 'C'),继续执行 ‘行2 - 3’,n == 1 返回输出:(a, "->", c)代入(1, 'A', 'B', 'C') ,即 A -> C

代码运行结束,输出结果为:

A -> C
A -> B
C -> B
A -> C
B -> A
B -> C
A -> C
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 专业考题类型管理运行工作负责人一般作业考题内容选项A选项B选项C选项D选项E选项F正确答案 变电单选GYSZ本规程...
    小白兔去钓鱼阅读 13,316评论 0 13
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 9,134评论 0 2
  • 波西米亚长裙和白色的外套被人从阴影里丢了出来,接着女孩拉开了汽车里装着的黑色遮光布,一个小时前,她还是外表清...
    璋予阅读 1,400评论 0 0
  • 柳浪莺啼春色丽; 蝉鸣蛙鼓稻花香。 沙鸥长戏青江水; 锦鲤竞开白龙门。 闲倚青山松下月; ...
    曾令琪西南文学杂志总编阅读 3,584评论 2 7
  • 我喜欢RPG,尤其是动作华丽,剧情史诗的,所以我第一款最爱,是《血源诅咒》。第一次玩这游戏,玩了10分钟就不玩了,...
    Cloudvi阅读 3,262评论 0 0

友情链接更多精彩内容