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

更新于: 2023 年 4 月 5 日

342 次查看

开启你的 职业生涯

通过完成课程获得认证

开始
广告