Bul*_*ula 11 closures fibonacci go
我正在他们的官方网站上进行巡回演出,我被要求写一个斐波纳契发电机.这里是:
 package main
import "fmt"
// fibonacci is a function that returns
// a function that returns an int.
func fibonacci() func() int {
    first := 0
    second := 0
    return func() int{
        if(first == 0) {
         first = 1
         second = 1
         return 0
        }else {
            current := first   
            firstc := second
            second = first + second
            first = firstc
            return current
        }
    }
}
func main() {
    f := fibonacci()
    for i := 0; i < 10; i++ {
        fmt.Println(f())
    }
}
有用.但是我觉得它非常难看,我确信必须有更好的解决方案.我一直在考虑在代码审查中发布这个,但是因为我要求更好的方法,我认为这是发布它的正确位置.
有没有更好的方法来编写这段代码?
这是任务:
实现一个fibonacci函数,它返回一个返回连续斐波那契数的函数(一个闭包).
jos*_*hlf 38
我最喜欢的实现迭代斐波那契数字的干净方法是使用firstf i  -  1和secondf i.Fibonacci方程表明:
f i + 1 = f i + f i - 1
除非我们在代码中写这个,在下一轮我们正在递增i.所以我们有效地做了:
f next i = f current i + f current i - 1
和
f next i - 1 = f current i - 1
我喜欢在代码中实现这个的方式是:
first, second = second, first + second
该first = second部分对应于更新f next i-1   = f current i-1,并且该second = first + second部分对应于更新f next i = f current i + f current i-1.
然后我们剩下要做的就是返回first的旧值,所以在进行更新之前我们会将它存储在临时变量中.总的来说,我们得到:
// fibonacci returns a function that returns
// successive fibonacci numbers from each
// successive call
func fibonacci() func() int {
    first, second := 0, 1
    return func() int {
        ret := first
        first, second = second, first+second
        return ret
    }
}
在Go Playground上观看它.
小智 6
另一种方法
func fibonacci() func() int {
    n1, n := -1, 1
    return func() int {
        n1, n = n, n1+n
        return n
    }
}
一个小技巧
package main
import "fmt"
// fibonacci is a function that returns
// a function that returns an int.
func fibonacci() func() int {
    a := 0
    b := 1
    return func() int {
        a, b = b, a+b
        return b-a
    }
}
func main() {
    f := fibonacci()
    for i := 0; i < 10; i++ {
        fmt.Println(f())
    }
}
我将利用多重赋值,减少标识符的长度,并删除 if 语句:
func fibonacci() func() int {
    var a, b int
    b = 1
    return func() int {
        ret := a
        a, b = b, a+b
        return ret
    }
}