27. 斐波纳契闭包

作者: 厚土火焱 | 来源:发表于2017-08-17 15:55 被阅读113次

此例我们用 go 语言的闭包实现一个斐波那契数列的返回值。
斐波那契数列,从第三个数字开始,每个数字都是前两个数字的和。
所以,我们需要在 fibonacci 函数中定义三个变量 x1,x2,sum。
而返回值使用闭包的方式,每次求和,扔掉x1的值,把x2的值赋值给x1,把sum的值赋值给x2,达到保存最新的斐波那契数字的目的。
sum 就是最终返回并打印的斐波那契数列的一个一个的值。

package main

import "fmt"

// fibonacci 函数会返回一个返回 int 的函数。
func fibonacci() func() int {
    x1, x2 := 0, 1
    sum := 0
    return func() int {
        sum = x1 + x2
        x1 = x2
        x2 = sum
        return sum
    }
}

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

此例中,因为斐波那契数字自身就具备循环的所有变量,因此,在打印语句中调用 fibonacci 函数对应变量时无需给入参数。
运行结果

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

相关文章

网友评论

  • 忉抗拇://稍微改了一点
    package main
    import "fmt"
    // fibonacci 函数会返回一个返回 int 的函数。
    func fibonacci() func(i int) int {
    x1, x2 := 0, 1
    sum := 0
    return func(i int) int {
    if(i <= 1) {
    x1 = 1
    x2 = 1
    sum = 1
    }else{
    sum = x1 + x2
    x1 = x2
    x2 = sum
    }
    return sum
    }
    }

    func main() {
    f := fibonacci()
    for i := 0; i < 25; i++ {
    fmt.Print(f(i),", ")
    }
    fmt.Println("...")
    }
  • 忉抗拇:楼主,错了,结果应该是这样才对
    1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89...
    忉抗拇:@厚土火烟 果然简单多了,第一次看到用闭包写斐波那契的,受教了
    厚土火焱:鉴于你如此的执着,好吧,我修改了一下,实现的方法要更简单一些。请看 fibonacci()的return 变量的变化。

本文标题:27. 斐波纳契闭包

本文链接:https://www.haomeiwen.com/subject/asqnrxtx.html