在 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 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始
廣告
© . All rights reserved.