面试题08. 06 汉诺塔
问题链接
https://leetcode.cn/problems/hanota-lcci/description/
解题思路
首先我们要定义递归函数。汉诺塔问题是典型的递归问题(缩小规模,小规模问题是大规模问题的子集),而且是典型的递归的定义就是递归的解的问题。
首先,我们定义一个汉诺塔函数,参数为 当前要处理的盘子数n, A盘子,B盘子和C盘子。
然后,我们定义递归函数的边界条件。如果n为1,则A柱子可以直接把盘子挪到C柱子上,而不用借助B柱子。
最后,我们定义本层应该做什么。
如果n不为1,我们需要:
- A借助C,把n-1个盘子挪动到B上。
- A直接把盘子挪动到C上。
- 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)