闭包函数实现斐波那契数列

package main

import "fmt"


// 方式1:
func main() {
    var g int
    num := 3
    func(i int) {
        if num <= 2 {
            g = 1
        } else {
            for m, n, j := 0, 1, 1; j < i; j++ {
                g = m + n
                m = n
                n = g
            }
        }
    }(num)
    fmt.Printf("第 %d 个斐波那契数为:%d\n", num, g) // Passes argument 1000 to the function literal.
}


// 方式2:
func cloForFib(num int) int {
    var g int
    go func(num int) {
        if num <= 2 {
            g = 1
        } else {
            for m, n, j := 0, 1, 1; j < num; j++ {
                g = m + n
                m = n
                n = g
            }
        }
    }(num)
    return g
}

func main() {
    num := 10
    g := cloForFib(num)
    fmt.Printf("第 %d 个斐波那契数为:%d\n", num, g)
}
讨论数量: 2
// 方式2:

var g int

func cloForFib(num int) <-chan struct{} {
    ch := make(chan struct{})
    go func(num int) {
        if num <= 2 {
            g = 1
        } else {
            for m, n, j := 0, 1, 1; j < num; j++ {
                g = m + n
                m = n
                n = g
            }
        }
        ch <- struct{}{}
    }(num)
    return ch
}

func main() {
    num := 6
    <-cloForFib(num)
    fmt.Printf("第 %d 个斐波那契数为:%d\n", num, g)
}

问题在第二个用协程去做计算,g 是函数内的局部变量,返回到 main 函数的 g 值为 0, 且与协程中 g 的地址不一样所以协程完成计算后的值没法赋值到 main 中的 g。如果设置为全局变量可以解决这个问题。

1年前 评论

在闭包中,如果有函数对变量进行引用的时候这个变量就会溢出到堆中变成全局变量,所以这里不是局部变量的问题,问题出在了协程,协程还没运行结束但是原方法已经退出了,所以这里可以用waitgroup解决。

func getFib(n int) int {
    cal := cloForFib()
    res := 1
    go func() {
        for i := 3; i <= n; i++ {
            res = cal()
            fmt.Printf("%d, %d, %p \n", i, res, &res)
        }
        wg.Done()
    }()
    wg.Wait()
    fmt.Printf("%d, %p \n", res, &res)
    return res
}

func cloForFib() func() int {
    a, b := 1, 1
    return func() int {
        a, b = a+b, a
        return a
    }
}
1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!