go - go中的斐波那契闭合

标签 go closures fibonacci

我正在关注他们官方网站上的 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())
    }
}

它有效。但是我认为它非常难看,我相信必须有更好的解决方案。我一直在考虑在 code-review 上发布这个,但是因为我要求更好的方法,我认为这是发布它的正确位置。

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

这是任务:

Implement a fibonacci function that returns a function (a closure) that returns successive fibonacci numbers.

最佳答案

我最喜欢通过斐波那契数实现迭代的简洁方法是将 first 用作 fi - 1,将 second 用作 f<子>我。斐波那契方程指出:

fi + 1 = fi + fi - 1

除非我们在代码中编写此代码,否则在下一轮我们将递增 i。所以我们正在有效地做:

f下一个 i = f当前 i + f当前 i - 1

f下一个 i - 1 = f当前 i

我喜欢在代码中实现它的方式是:

first, second = second, first + second

first = second部分对应更新fnext i - 1 = fcurrent isecond = first + second 部分对应更新 fnext i = fcurrent i + fcurrent 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 上查看实际情况.

关于go - go中的斐波那契闭合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25491370/

相关文章:

java - 打印第 N 个斐波那契数的代码

javascript - 闭包有什么好处,它们通常在什么时候使用?

recursion - 我该如何编写这个 Clojure 函数才不会耗尽堆栈?

c - 在 O(logn) 中找到第 n 个 fib 数

go - 动态JSON解码

javascript - 事件绑定(bind)是什么意思?

javascript - 一系列的 promise

随机索引分布怪异

for-loop - 可以在 'for .. range' 循环中的每次迭代后添加 final 语句(就像在标准 for 循环中一样)吗?

go - Go例程中的 channel 使用情况