在 Golang 中实现汉诺塔
在本文中,我们将学习如何使用递归方法和迭代来在 Golang 中实现汉诺塔。汉诺塔是一个谜题,其中我们将一组圆盘从一个页面移动到另一个页面,每次移动一个圆盘。在这个谜题中,需要遵守某些规则。
使用递归方法
在这种方法中,我们将编写一个 Go 语言程序,使用递归方法来实现汉诺塔。
如果 n 为 1,我们可以直接将圆盘从 from 移动到 to。否则,我们首先将 n-1 个圆盘从 from 移动到 via,然后将第 n 个圆盘从 from 移动到 to,最后将 n-1 个圆盘从 via 移动到 to。
算法
步骤 1 − 首先,我们需要导入 fmt 包。
步骤 2 − 然后,创建一个名为 hanoi() 的函数。此函数接受三个参数,第一个是传递的字符串变量的数量,其他是字符串变量。
步骤 3 − 然后开始 main() 函数。在 main() 中,通过传递所需的参数来调用 hanoi() 函数。
步骤 4 − 如果 n == 1,则将圆盘从 from 桩移动到 to 桩并停止程序。否则,使用 n – 1、from 桩、via 桩和 to 桩作为参数递归调用 hanoi() 函数,并使用 fmt.Println() 函数在屏幕上打印结果。
示例
在下面的示例中,我们将了解如何开发一个 Go 语言程序,使用递归方法来实现汉诺塔
package main
import "fmt"
func hanoi(n int, from string, to string, via string) {
if n == 1 {
fmt.Printf("Move disk 1 from %s to %s\n", from, to)
} else {
hanoi(n-1, from, via, to)
fmt.Printf("Move disk %d from %s to %s\n", n, from, to)
hanoi(n-1, via, to, from)
}
}
func main() {
hanoi(3, "A", "C", "B")
}
输出
Move disk 1 from A to C Move disk 2 from A to B Move disk 1 from C to B Move disk 3 from A to C Move disk 1 from B to A Move disk 2 from B to C Move disk 1 from A to C
使用迭代的概念
在这种方法中,我们将编写一个 Go 语言程序,使用迭代的概念来实现汉诺塔。
语法
func len(v Type) int
len() 函数用于获取任何参数的长度。它将要查找长度的数据类型变量作为参数,并返回表示变量长度的整数值。
func append(slice, element_1, element_2…, element_N) []T
append 函数用于向数组切片添加值。它接受多个参数。第一个参数是要添加值的数组,后跟要添加的值。然后,该函数返回包含所有值的最终数组切片。
算法
步骤 1 − 首先,我们需要导入 fmt 包。
步骤 2 − 接下来创建一个名为 hanoi() 的函数。此函数接受四个参数。第一个是表示字符串数量的整数值,而其他是字符串变量。
步骤 3 − 在此函数内部创建一个名为 stack 的空数组,并将作为参数获得的变量存储在其中。
步骤 4 − 然后使用 for 循环遍历 stack 数组,并使用 for 循环通过 fmt.Println() 函数在屏幕上打印各种桩位置。
示例
在下面的示例中,我们将了解如何开发一个 Go 语言程序,使用迭代的概念来实现汉诺塔
package main
import "fmt"
func hanoi(n int, from string, to string, via string) {
stack := make([][3]string, 0)
stack = append(stack, [3]string{from, to, via})
for len(stack) > 0 {
task := stack[len(stack)-1]
stack = stack[:len(stack)-1]
if n == 1 {
fmt.Printf("Move disk 1 from %s to %s\n", task[0], task[1])
} else {
stack = append(stack, [3]string{task[2], task[1], task[0]})
stack = append(stack, [3]string{task[0], task[1], task[2]})
stack = append(stack, [3]string{task[1], task[2], task[0]})
n--
}
}
}
func main() {
hanoi(3, "A", "C", "B")
}
输出
Move disk 1 from B to A Move disk 1 from C to B Move disk 1 from A to B Move disk 1 from A to C Move disk 1 from B to C
结论
我们已成功编译并执行了一个 Go 语言程序来实现汉诺塔以及示例。我们将使用两种不同的方法来实现这一点。在第一种方法中,我们使用递归方法,而在第二种方法中,我们使用迭代方法。
数据结构
网络
关系型数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP