拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Java 递归之汉诺塔:搞懂为什么换个参数名字就能移动盘子

Java 递归之汉诺塔:搞懂为什么换个参数名字就能移动盘子 Java 递归 汉诺塔 新手学习今天上课学了汉诺塔递归一开始完全看不懂为什么调换一下参数名字代码就知道怎么移动盘子了。写下来记录一下我是怎么想明白的。汉诺塔问题三个柱子 A、B、C有 n 个盘子叠在 A 上要全部移到 C 上。规则每次只能动一个盘子大的不能放在小的上面。递归思路不要想着怎么一步步移动先想大问题怎么拆成小问题要把 n 个盘子从 A 移到 C分三步先把上面 n-1 个盘子从 A 移到 B借助 C把最底下最大的那个盘子从 A 直接移到 C再把 B 上的 n-1 个盘子从 B 移到 C借助 A而移动 n-1 个盘子的方法和移动 n 个盘子的方法是一模一样的只是起点、辅助、目标换了。这就是递归。代码public static void hanoi(int n, char pos1, char pos2, char pos3) { if (n 1) { move(pos1, pos3); return; } hanoi(n - 1, pos1, pos3, pos2); move(pos1, pos3); hanoi(n - 1, pos2, pos1, pos3); } public static void move(char pos1, char pos2) { System.out.println(pos1 - pos2); } public static void main(String[] args) { hanoi(3, A, B, C); }我一开始最困惑的问题为什么代码里没有真的去记录每个柱子上有几个盘子只是调换 pos1、pos2、pos3 这三个参数就知道怎么移动了后来想明白了三个物理柱子 A、B、C 是固定不变的。hanoi 方法的三个参数 pos1、pos2、pos3根本不是代表 A、B、C 这三个柱子本身而是代表三个角色pos1当前这个任务的起点pos2当前这个任务的辅助pos3当前这个任务的目标比如调用 hanoi (3, A, B, C) 起点是 A辅助是 B目标是 C。然后第一个递归调用 hanoi (n-1, pos1, pos3, pos2) 意思是现在要搬上面 n-1 个盘子这个子任务的起点还是 A但是辅助换成了 C目标换成了 B。A、B、C 这三个字母从来没变过只是在不同的子任务里它们扮演的角色不一样了。代码根本不需要知道每个柱子上现在有几个盘子它只需要按照规则把大任务拆成三个小步骤然后递归下去就行。n1 是什么意思n1 是递归的终点。当分到只剩 1 个盘子的时候不用再拆了直接把这个盘子从当前任务的起点 pos1移到当前任务的目标 pos3然后 return 结束这一层。这里的 pos1 和 pos3已经是经过层层调换后的角色了所以 move 打印出来的移动步骤就是正确的。单引号和双引号的问题一开始写 hanoi (3, A, B, C) 报错了因为方法参数定义的是 char 类型char 只能放单个字符必须用单引号 A。双引号是 String 字符串类型对不上。运行结果n3A-C A-B C-B A-C B-A B-C A-C一共 7 步正确。一点心得递归这个东西光看代码真的绕。我后来把 n3 的每一层调用都写在纸上一层一层列出来看哪些时候进 if哪些时候执行 move哪些时候 return才慢慢搞懂
返回列表