q

18 阅读1分钟

汉诺塔递归策略详解:

对于 f(n, A, C, B)(将n个盘子从A移动到C,借助B):

  1. 递归基n == 1

    • 直接移动:A → C
  2. 递归步骤n > 1

    • 步骤1:将上面的 n-1 个盘子从 A → B(借助C)
    • 步骤2:将最大的盘子从 A → C
    • 步骤3:将 n-1 个盘子从 B → C(借助A)

执行示例(f(3, "A", "C", "B")):

text

css
 体验AI代码助手
 代码解读
复制代码
css
 体验AI代码助手
 代码解读
复制代码
A -> C
A -> B
C -> B
A -> C
B -> A
B -> C
A -> C
css
 体验AI代码助手
 代码解读
复制代码
scala
 体验AI代码助手
 代码解读
复制代码
object Main {
    /*
    * 汉诺塔游戏
    * 
    */
    
    // f(n, a, c, b) 把 n 个盘子从 a → c,借用 b
    def f(n: Int, A: String, C: String, B: String): Unit = {
        if (n == 1) {
            println(s"${A} -> ${C}")  // 修正了字符串插值语法
        } else {
            // 1. 把 n-1 个盘子从 AB,借助 C
            f(n - 1, A, B, C)
            // 2. 把最大的盘子从 A → C
            println(s"${A} -> ${C}")
            // 3. 把 n-1 个盘子从 B → C,借助 A
            f(n - 1, B, C, A)
        }
    }

    def main(args: Array[String]): Unit = {
        f(3, "A", "C", "B")  // 修正了参数,应该是数字3而不是S
    }
}