关闭

递归调用--汉诺塔

标签: 递归
374人阅读 评论(0) 收藏 举报
分类:

来自学习笔记

def move(n,a,b,c):
    if n ==1:
        print('move',a,'-->',c)
        return
    move(n-1,a,c,b)
    print('move',a,'--->',c)
    move(n-1,b,a,c)

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

输出为
move A –> C
move A —> B
move C –> B
move A —> C
move B –> A
move B —> C
move A –> C

(1) 一定要理解递归的内涵。当你定义好一个递归函数的时候,你一定要明白这个递归函数的作用。例如在这个问题中move(n,a,b,c)就代表着有n个盘需要从a通过b的帮助来移动到c;而且注意这里的第2,3,4个参数是变量,代表着柱子的名字。move(5,m,n,k)就代表有3个柱子分别叫做m,n,k,我需要把5个盘子从m通过n移动到k

(2) 这里可以把顶部的n-1个盘子看成一个整体,这样这个问题就变成只要解决2个盘子的问题了,步骤自然是只要3步即可。由于我们把其中的n-1个盘子看成了整体,所以每次要对这n-1个盘子进行操作的时候就要使用递归函数。因为n-1个盘子不是随便就能移动的。这就是使用递归函数的时机

(3) 有人可能会问为什么不把底部的n-1个盘子看成一个整体来移动?这是因为汉诺塔的规则限制,小盘子必须放在大盘子上面。如果你把底部n-1个盘子看成整体来递归操作,会发现违反这种规则的情况,所以是不建议这么做的

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:10234次
    • 积分:335
    • 等级:
    • 排名:千里之外
    • 原创:23篇
    • 转载:7篇
    • 译文:0篇
    • 评论:3条
    最新评论