- 汉诺塔的基本问题就大家百度吧。
- 算法的核心就是把最下边的盘子当作一个盘子,把上边的所有盘子,是所有盘子当作一个盘子处理。把上边所有盘子都移动到过渡的位置上,再把最下边的盘子移动到目标盘子上,最后再把上边所有的盘子放到最下边的盘子上边。
- 先看一下代码吧
public class HanoiTest { public static void main(String[] args) { hanoi(3, 'A', 'B', 'C'); } /** * hanoi方法 * 1、第一个参数是要移动的盘子的序号 * 2、第二个参数是要移动过的盘子的起始位置 * 3、第三个参数是要移动盘子的过渡位置 * 4、第四个参数是要移动盘子的目标位置 * */ public static void hanoi(int n, char from, char in, char to){ if(n == 1){ System.out.println("第1个盘子从" + from + "移动到" + to ); }else { // 比如现在n==2,下边的操作分别是将n==1的盘子从当前位置放到过渡的位置,再把当前 // 盘子移动到目标位置,最后再把n==1盘子放到当前盘子的上边 // 如果是三个的话,就把上边两个盘子看成是一个整体,这是非常关键的。 // 这两步可以看成把上边所有的盘子都先移动到过渡的位置,再把最下边的盘子移动到目标位置 // 最后把上边所有盘子移动到目标盘子上边 hanoi(n-1, from, to, in); System.out.println("第" + n + "个盘子从" + from + "移动到" + to); hanoi(n-1, in,from,to); } } }
-
在hanoi方法中先调用一次hanoi,也就是把上边的所有盘子移动到过渡位置,然后再把最下边的盘子移动到目标位置,再调用一次hanoi,把上边所有的盘子都移动到目标位置。
-
那么到底怎么样理解这个递归呢
-
在第一次调用hanoi的时候,会进入下一层的hanoi,然后如果下一层还不是最后一个的话,就又会调用一次hanoi,当只剩下两个的时候,调用一次hannoi,然后n就是1了,然后这最上边的那个 就会直接移动到中间过渡位置。
-
在把最上边的盘子移动到过渡位置之后呢,就会回到n==2的方法之后中了,这时候就会把n==2的盘子移动到目标位置,然后呢就又是 递归调用hanoi方法,不过这次是将上边的盘子移动到目标位置。
-
当n==3的时候,把上边两个方法当作一个盘子,然后做法就和两个盘子一样啦。
-
算法 汉诺塔
最新推荐文章于 2025-05-17 18:19:32 发布