在 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 语言程序来实现汉诺塔以及示例。我们将使用两种不同的方法来实现这一点。在第一种方法中,我们使用递归方法,而在第二种方法中,我们使用迭代方法。