Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah penutupan golang melaksanakan rekursi

Bagaimanakah penutupan golang melaksanakan rekursi

PHPz
PHPzasal
2023-03-30 09:07:57667semak imbas

Penutupan Golang ialah ciri bahasa yang sangat berkuasa yang membolehkan kami mentakrifkan fungsi di dalam fungsi dan fungsi itu boleh mengakses pembolehubah dalam skop fungsi luar. Penggunaan penutupan boleh memudahkan logik kod, menjadikan kod lebih mudah dibaca dan diselenggara. Dalam artikel ini, kami akan memperkenalkan cara menggunakan penutupan Golang untuk melaksanakan rekursi.

1. Rekursi

Rekursi ialah proses tindanan sistem pengendaliannya ialah fungsi boleh memanggil dirinya sendiri semasa pelaksanaan. Fungsi rekursif boleh menyelesaikan banyak masalah kompleks, seperti mengira nombor Fibonacci, traversal pokok binari, dan sebagainya.

2. Pelaksanaan rekursif mudah

Di Golang, pelaksanaan rekursif perlu memberi perhatian kepada dua isu:

  1. Perlu ada syarat penamatan, jika tidak gelung tak terhingga akan berlaku masalah.
  2. Setiap rekursi memerlukan menghantar data ke rekursi seterusnya.

Berikut ialah pelaksanaan rekursif mudah untuk mengira faktorial bagi n:

func factorial(n int) int {
    if n == 1 {
        return 1
    }
    return n * factorial(n-1)
}

3 Penutupan rekursi

Dalam penutupan Golang, kita boleh Tentukan a fungsi di dalam fungsi dan fungsi itu boleh mengakses pembolehubah dalam skop fungsi luar. Oleh itu, kita boleh melaksanakan rekursi melalui penutupan.

Mengambil jujukan Fibonacci sebagai contoh, berikut ialah program ringkas yang dilaksanakan menggunakan pengulangan penutupan:

func fibonacci() func() int {
    a, b := 0, 1
    return func() int {
        a, b = b, a+b
        return a
    }
}

func main() {
    f := fibonacci()
    for i := 0; i < 10; i++ {
        fmt.Println(f())
    }
}

Program ini akan mengeluarkan sepuluh sebutan pertama jujukan Fibonacci.

Penjelasan kod:

Mula-mula kita mentakrifkan fungsi fibonacci, yang mengembalikan fungsi. Fungsi ini mentakrifkan dua pembolehubah a dan b secara dalaman, yang digunakan untuk mewakili dua sebutan pertama jujukan Fibonacci.

Seterusnya, kami mengembalikan fungsi. Fungsi ini menggunakan penutupan secara dalaman untuk melaksanakan rekursi Setiap kali fungsi dipanggil, nilai a dan b dikemas kini kepada b dan a+b terakhir, dan nilai a dikembalikan.

Akhir sekali, kami memanggil fungsi ini dalam fungsi utama dan mencetak sepuluh nilai pertama jujukan Fibonacci.

4. Aplikasi pengulangan penutupan

Menggunakan rekursi penutupan, kami boleh melaksanakan banyak aplikasi menarik, seperti masalah FizzBuzz, Towers of Hanoi, dll. Mari kita ambil Towers of Hanoi sebagai contoh untuk memperkenalkan cara menggunakan pengulangan penutupan.

Towers of Hanoi ialah masalah matematik yang sangat klasik Ia adalah algoritma bahagi-dan-takluk yang dilaksanakan melalui rekursi. Penerangan masalah adalah seperti berikut:

Terdapat tiga tiang iaitu A, B dan C. Terdapat 64 cakera yang berbeza saiz pada tiang A. Cakera yang berlainan saiz diletakkan di atas A mengikut susunan dari kecil ke besar. Pada tiang, kini semua cakera perlu dialihkan ke tiang C. Peraturan berikut perlu dipatuhi semasa pergerakan:

  1. Hanya satu cakera boleh digerakkan pada satu masa.
  2. Cakera besar tidak boleh berada di atas cakera kecil.

Berikut ialah kod untuk melaksanakan Towers of Hanoi menggunakan pengulangan penutupan:

func Hanoi(n int) func(string, string, string) {
    if n == 1 {
        return func(a, _, c string) {
            fmt.Println("Move disk from", a, "to", c)
        }
    }
    h := Hanoi(n - 1)
    return func(a, b, c string) {
        h(a, c, b)
        fmt.Println("Move disk from", a, "to", c)
        Hanoi(n-1)(b, a, c)
    }
}

func main() {
    Hanoi(3)("A", "B", "C")
}

Program ini akan mengeluarkan langkah khusus untuk mengalihkan tiga cakera dari A ke C.

Penjelasan kod:

Mula-mula kita mentakrifkan fungsi Hanoi, yang mengembalikan fungsi. Jika parameter lulus n adalah sama dengan 1, maka fungsi penutupan dikembalikan secara langsung, yang bertanggungjawab untuk memindahkan cakera dari tiang A ke tiang C.

Jika nilai n masuk lebih besar daripada 1, kemudian panggil secara rekursif Hanoi(n-1), kemudian keluarkan langkah khusus untuk mengalihkan cakera dari satu tiang ke tiang lain, dan akhirnya panggil Hanoi(n-1) Gerakkan cakera ke tiang C.

Akhir sekali, kami memanggil fungsi ini dalam fungsi utama dan mencetak langkah pergerakan tertentu.

5. Ringkasan

Dalam artikel ini, kami memperkenalkan konsep asas dan penggunaan penutupan Golang, dan menunjukkan penggunaan pengulangan penutupan untuk menyelesaikan masalah yang berbeza melalui contoh. Rekursi penutupan ialah teknik pengaturcaraan yang sangat menarik dan berkuasa, yang boleh memudahkan logik kod dan meningkatkan kebolehbacaan dan kebolehselenggaraan kod. Sudah tentu, rekursi penutupan juga perlu digunakan dengan berhati-hati, jika tidak, ia boleh menyebabkan beberapa masalah yang tidak dijangka.

Atas ialah kandungan terperinci Bagaimanakah penutupan golang melaksanakan rekursi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn