此例我们用 go 语言的闭包实现一个斐波那契数列的返回值。
斐波那契数列,从第三个数字开始,每个数字都是前两个数字的和。
所以,我们需要在 fibonacci 函数中定义三个变量 x1,x2,sum。
而返回值使用闭包的方式,每次求和,扔掉x1的值,把x2的值赋值给x1,把sum的值赋值给x2,达到保存最新的斐波那契数字的目的。
sum 就是最终返回并打印的斐波那契数列的一个一个的值。
package main
import "fmt"
// fibonacci 函数会返回一个返回 int 的函数。
func fibonacci() func() int {
x1, x2 := 0, 1
sum := 0
return func() int {
sum = x1 + x2
x1 = x2
x2 = sum
return sum
}
}
func main() {
f := fibonacci()
for i := 0; i < 10; i++ {
fmt.Print(f(),", ")
}
fmt.Println("...")
}
此例中,因为斐波那契数字自身就具备循环的所有变量,因此,在打印语句中调用 fibonacci 函数对应变量时无需给入参数。
运行结果
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
好吧,这里其实还有一点小瑕疵,真正的神奇数列也就是斐波那契数字的第一和第二个数字都是 1,那么,我们只需要做一个小小的更改。
func fibonacci() 函数的 return 改为
return x1
那么代码将变成这个样子
// fibonacci 函数会返回一个返回 int 的函数。
func fibonacci() func() int {
x1, x2 := 0, 1
sum := 0
return func() int {
sum = x1 + x2
x1 = x2
x2 = sum
//return sum
return x1
}
}
最终的运行结果就是
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...