为了账号安全,请及时绑定邮箱和手机立即绑定

go中的斐波那契闭包

go中的斐波那契闭包

Go
噜噜哒 2021-08-10 20:35:58
我正在关注他们官方网站上的 go tour,有人要求我编写一个斐波那契生成器。这里是: package mainimport "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())    }}有用。但是我认为它非常丑陋,我相信必须有更好的解决方案。我一直在考虑将其发布在代码审查上,但是因为我要求更好的方法,所以我认为这是发布它的正确位置。有没有更好的方法来编写这段代码?这是任务:实现一个斐波那契函数,该函数返回一个返回连续斐波那契数的函数(一个闭包)。
查看完整描述

3 回答

?
撒科打诨

TA贡献1934条经验 获得超2个赞

我最喜欢的实现斐波那契数列迭代的简洁方法是使用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 call

func fibonacci() func() int {

    first, second := 0, 1

    return func() int {

        ret := first

        first, second = second, first+second

        return ret

    }

}

在Go Playground上查看它的运行情况。


查看完整回答
反对 回复 2021-08-10
?
茅侃侃

TA贡献1842条经验 获得超21个赞

另一种方法


func fibonacci() func() int {

    n1, n := -1, 1

    return func() int {

        n1, n = n, n1+n

        return n

    }

}


查看完整回答
反对 回复 2021-08-10
  • 3 回答
  • 0 关注
  • 270 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信