Go语言实现汉诺塔递归算法详解
本文介绍了如何使用Go语言实现经典的汉诺塔问题求解算法。通过标准库处理用户输入,核心逻辑采用递归函数分治解决盘子移动步骤。代码包含完整的输入校验与移动路径打印功能,适合入门者理解递归思想及Go基础语法应用。
结果或目标
运行程序后,用户可以输入汉诺塔的盘子数量(正整数),程序将依次打印出每一层盘子从起始柱子移动到目标柱子的具体操作指令。
准备条件
- 已安装 Go 语言环境并配置好GOPATH。
- 创建文件
hano.go。
真实操作顺序
第1步:编写完整代码
在终端编辑器中打开 hano.go 文件,将以下代码写入。该代码实现了两个主要部分:主函数用于获取和验证用户输入,hanoi 函数负责核心的递归逻辑。
package main
import (
"bufio"
"fmt"
"os"
"strconv"
)
func main() {
fmt.Print("输入要移动的盘子数:")
reader := bufio.NewReader(os.Stdin)
lool:
data, _, _ := reader.ReadLine()
n, err := strconv.Atoi(string(data))
if err != nil {
fmt.Println(err)
goto lool
}
hanoi(n, 'A', 'B', 'C')
}
func hanoi(n int, a, b, c byte) {
if n > 1 {
hanoi(n-1, a, c, b)
fmt.Printf("%c-->%c\n", a, c)
hanoi(n-1, b, a, c)
} else {
fmt.Printf("%c-->%c\n", a, c)
}
}
第2步:编译并运行
在终端进入文件所在目录,执行以下命令:
go run hano.go
此时程序会等待输入。输入一个数字(例如 3)并按回车键,控制台将输出如下形式的移动过程:
A-->C
A-->B
C-->B
A-->C
B-->A
B-->C
A-->C
第3步:理解代码逻辑
输入处理模块:
利用 bufio.NewReader 和 os.Stdin 获取用户输入。使用 strconv.Atoi 将字符串转为整数。若转换失败,通过 goto 语句跳转回标签 lool 处重新请求输入,确保参数有效性。
递归核心逻辑 (hanoi):
参数说明:n为当前待移动的盘子数,a为起始柱,b为辅助柱,c为目标柱。
- 基本情况 (Base Case):当
n == 1时,直接将盘子从柱子a移到柱子c并打印信息。 - 递归步骤 (Recursive Step):当
n > 1时:- 将上面的
n-1个盘子从a借助c移至b(调用hanoi(n-1, a, c, b))。 - 将第
n个最大的盘子直接从a移至c(打印a-->c)。 - 将那
n-1个盘子从b借助a移至c(调用hanoi(n-1, b, a, c))。
- 将上面的
完成判断
当控制台按顺序输出了所有盘子从起点柱子到终点柱子的单次移动指令,且未报错时,即为执行成功。
以上就是Go语言实现汉诺塔递归算法的详细内容,更多关于Go语言算法的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













