面试题08. 06 汉诺塔

问题链接

https://leetcode.cn/problems/hanota-lcci/description/

解题思路

首先我们要定义递归函数。汉诺塔问题是典型的递归问题(缩小规模,小规模问题是大规模问题的子集),而且是典型的递归的定义就是递归的解的问题。

首先,我们定义一个汉诺塔函数,参数为 当前要处理的盘子数n, A盘子,B盘子和C盘子。

然后,我们定义递归函数的边界条件。如果n为1,则A柱子可以直接把盘子挪到C柱子上,而不用借助B柱子。

最后,我们定义本层应该做什么。

如果n不为1,我们需要:

  1. A借助C,把n-1个盘子挪动到B上。
  2. A直接把盘子挪动到C上。
  3. B借助A,把n-1个盘子挪动到C上。

初学者可能会疑问,A借助C怎么把n-1个挪到B上?那是递归函数要考虑的,不是你要考虑的。你只要记住,递归的定义就是递归的解,解是怎么出来的,递归函数自己清楚。

代码

class Solution:
    def hanota(self, A: List[int], B: List[int], C: List[int]) -> None:
        self.handler(len(A), A, B, C)
    def handler(self, n, A, B, C):
        if n == 1:
            C.append(A.pop())
        else:
            self.handler(n-1, A, C, B)
            self.handler(1, A, B, C)
            self.handler(n-1, B, A, C)

 

posted @ 2023-01-05 18:52  BJFU-VTH  阅读(35)  评论(0编辑  收藏  举报