面试题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)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)