猿问

go中的斐波那契闭包

我正在关注他们官方网站上的 go tour,有人要求我编写一个斐波那契生成器。这里是:


 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())

    }

}

有用。但是我认为它非常丑陋,我相信必须有更好的解决方案。我一直在考虑将其发布在代码审查上,但是因为我要求更好的方法,所以我认为这是发布它的正确位置。


有没有更好的方法来编写这段代码?


这是任务:


实现一个斐波那契函数,该函数返回一个返回连续斐波那契数的函数(一个闭包)。


噜噜哒
浏览 272回答 3
3回答

撒科打诨

我最喜欢的实现斐波那契数列迭代的简洁方法是使用firstas f i - 1和secondas f i。斐波那契方程指出:f i + 1 = f i + f i - 1除非我们在代码中编写此内容,否则在下一轮中我们将递增i。所以我们正在有效地做:f下一个 i = f当前 i + f当前 i - 1和f下一个 i - 1 = f当前 i我喜欢在代码中实现这一点的方式是:first, second = second, first + second该first = second部分对应更新 f next i - 1 = f current i,该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 callfunc fibonacci() func() int {&nbsp; &nbsp; first, second := 0, 1&nbsp; &nbsp; return func() int {&nbsp; &nbsp; &nbsp; &nbsp; ret := first&nbsp; &nbsp; &nbsp; &nbsp; first, second = second, first+second&nbsp; &nbsp; &nbsp; &nbsp; return ret&nbsp; &nbsp; }}在Go Playground上查看它的运行情况。

茅侃侃

另一种方法func fibonacci() func() int {&nbsp; &nbsp; n1, n := -1, 1&nbsp; &nbsp; return func() int {&nbsp; &nbsp; &nbsp; &nbsp; n1, n = n, n1+n&nbsp; &nbsp; &nbsp; &nbsp; return n&nbsp; &nbsp; }}
随时随地看视频慕课网APP

相关分类

Go
我要回答