我正在关注他们官方网站上的 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 i,second = 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/