汉诺塔问题背景
汉诺塔是经典的递归问题:
- 有 3 根柱子(通常记为 A、B、C),A 柱上叠放着 n 个大小不同的圆盘(自上而下从小到大)。
- 目标是将所有圆盘从 A 柱移动到 C 柱,每次只能移动 1 个圆盘,且大盘不能放在小盘上面。
代码逻辑分析
代码定义了函数f(n:Int, A:String, C:String, B:String),意图通过递归求解 n 个圆盘的移动步骤,参数含义:
n:需移动的圆盘数量A:起始柱(初始放圆盘的柱子)C:目标柱(最终要移到的柱子)B:辅助柱(临时中转的柱子)
1. 递归终止条件(n=1 时)
if(n == 1){
println(s"${A} → ${C}")
}
- 当只有 1 个圆盘时,直接从起始柱 A 移动到目标柱 C,逻辑正确。
2. 递归逻辑(n>1 时)
else {
f(n-1,A,B,C) // 步骤1:将n-1个圆盘从A移到B(用C做辅助)
println(s"${A} ← ${C}") // 步骤2:移动第n个圆盘(最大盘)
f(n-1,B,C,A) // 步骤3:将n-1个圆盘从B移到C(用A做辅助)
}
汉诺塔逻辑
- 先将 A 柱上的 n-1 个圆盘通过 C 柱辅助,移动到 B 柱;
- 将 A 柱上剩下的最大圆盘直接移动到 C 柱;
- 最后将 B 柱上的 n-1 个圆盘通过 A 柱辅助,移动到 C 柱。
代码
def f(n:Int, A:String, C:String, B:String): Unit = {
if(n == 1){
println(s"${A} → ${C}") // 1个圆盘直接移
} else {
f(n-1, A, B, C) // 步骤1:n-1个从A→B(用C辅助)
println(s"${A} → ${C}") // 步骤2:最大盘从A→C
f(n-1, B, C, A) // 步骤3:n-1个从B→C(用A辅助)
}
}
def main(args: Array[String]): Unit = {
f(3,"A","C","B") // 以3个圆盘为例,输出正确步骤
}