Discuss / Python / 这道题的难点在于怎么把汉诺塔问题和递归联系起来

这道题的难点在于怎么把汉诺塔问题和递归联系起来

Topic source

参考递归函数的定义(一个函数在内部调用自身本身)和教程里面定义的阶乘函数(fact(n) = fact(n−1)×n),找到move(n,a, b, c)和move(n-1,a, b, c)的关系才是这道题的关键,类似于数列求通项的关键在于先找出递推关系,所以思考怎么一块一块移动很容易进入思维误区。既然联系到了move(n-1,a, b, c),我们就需要把最上面的n-1块盘子视为一个整体(不用去思考这n-1块具体要怎么移动,只要我们建立了递归关系,会自然的迭代到move(n-2,a, b, c)、move(n-3,a, b, c),直至move(1,a, b, c),而move(1,a, b, c)的操作已知),这时我们要做的就是:①把上面的n-1块(这是一个整体,可视为一块)从柱子‘A’移至柱子‘B’;②把最下面的一块从柱子'A'移至柱子‘C’;③把刚刚移至柱子‘B’的n-1块移至柱子‘C’。

def move(n, a, b, c):
    if n == 1:
        print(a, '-->', c)
    else:
        move(n-1, a, c, b) #把前n-1块从柱子A移至柱子B
        print(a, '-->', c) #把最大块从柱子A移至柱子C
        move(n-1, b, a, c) #把前n-1块从柱子B移至柱子C
    return

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

一块一块的想真的会进入误区,我现在脑子都快炸了!


  • 1

Reply