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柱,停止程序。否则,使用fmt.Println()函数递归调用hanoi()函数,并将n – 1,from柱,via柱和to柱作为参数打印结果在屏幕上。
示例
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数组并使用fmt.Println()函数打印屏幕上的各种柱子位置。
示例
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")
}
在以下示例中,我们将了解如何通过使用迭代概念来开发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("将第 1 个碟子从 %s 移动到 %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")
}
输出结果
将第 1 个碟子从 B 移动到 A
将第 1 个碟子从 C 移动到 B
将第 1 个碟子从 A 移动到 B
将第 1 个碟子从 A 移动到 C
将第 1 个碟子从 B 移动到 C
结论
我们已经成功编译并执行了一个go语言程序来实现汉诺塔,并附有示例。我们将使用两种不同的方法来实现这一点。在第一种方法中,我们使用递归方法,而在第二种方法中,我们使用迭代方法。
极客教程