java - 汉诺塔递归算法

标签 java algorithm recursion

我在理解这个汉诺塔递归算法时遇到问题:

public class MainClass {
  public static void main(String[] args) {
    int nDisks = 3;
    doTowers(nDisks, 'A', 'B', 'C');
  }

  public static void doTowers(int topN, char from, char inter, char to) {
    if (topN == 1){
      System.out.println("Disk 1 from " + from + " to " + to);
    }else {
      doTowers(topN - 1, from, to, inter);
      System.out.println("Disk " + topN + " from " + from + " to " + to);
      doTowers(topN - 1, inter, from, to);
    }
  }
}

输出是:

Disk 1 from A to C
Disk 2 from A to B
Disk 1 from C to B
Disk 3 from A to C
Disk 1 from B to A
Disk 2 from B to C
Disk 1 from A to C

我不明白我们如何得到:

Disk 1 from C to B
Disk 3 from A to C
Disk 1 from B to A

有人可以解释一下吗?

谢谢。

最佳答案

将 N-1 个(除最后一个以外的所有圆盘)塔从 A 移动到 B,然后将第 N 个圆盘从 A 移动到 C,最后移动塔,即可将 N 个圆盘塔从挂钉 A 移动到 C之前移动到 B,从 B 到 C。任何时候移动具有多个磁盘的塔时都应应用此方法,在 1 磁盘塔的情况下,您只需移动其唯一的磁盘。

关于java - 汉诺塔递归算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12483764/

相关文章:

Java 快速创建具有一组可能性的数组的方法

java - Firebase 身份验证用户为空

search - 如何在 Vim 的目录中递归搜索和替换?

algorithm - 在使用时间变量寻找关节点算法中,为什么我们不取子节点和父节点的低时间的最小值

java - 将单个字符重复到字符数组。设置数组的长度以匹配字符串所需的长度

java - 仅斐波那契 For 循环

javascript - 压平数组元素(不是整个数组)javascript的有效方法

performance - 是否有一种算法可以在成本和大小限制下获得最高值(value)?

sql - 如何找到最常见标签的记录,如StackOverflow中的相关问题

gcc - gcc -O2 对递归斐波那契函数做了什么?