斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=1,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)(百度百科)
用文字来说,就是费波那契数列由0和1开始,之后的费波那契系数就是由之前的两数相加而得出。
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233……
特别指出:0不是第一项,而是第零项。
本次代码有3种实现方式
1)递归
2)迭代
3)闭包
代码如下:
package main import "fmt" func main() { n := 7 i := Fibo1(n) j := Fibo2(n) k := Fibo3(n) fmt.Printf("%v %v %v", i, j, k) } //递归实现 func Fibo1(n int) int { if n == 0 { return 0 } else if n == 1 { return 1 } else if n > 1 { return Fibo1(n-1) + Fibo1(n-2) } else { return -1 } } //迭代实现 func Fibo2(n int) int { if n < 0 { return -1 } else if n == 0 { return 0 } else if n <= 2 { return 1 } else { a, b := 1, 1 result := 0 for i := 3; i <= n; i++ { result = a + b a, b = b, result } return result } } //利用闭包 func Fibo3(n int) int { if n < 0 { return -1 } else { f := Fibonacci() result := 0 for i := 0; i < n; i++ { result = f() } return result } } func Fibonacci() func() int { a, b := 0, 1 return func() int { a, b = b, a+b return a } }
简单的测试用例代码如下:
package main import "testing" var testArr = []int{0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89} func TestFibo1(t *testing.T) { for i, v := range testArr { if actual := Fibo1(i); actual != v { t.Errorf("Fibo1(%v): got %v, expected %v\n", i, actual, v) } } } func TestFibo2(t *testing.T) { for i, v := range testArr { if actual := Fibo2(i); actual != v { t.Errorf("Fibo2(%v): got %v, expected %v\n", i, actual, v) } } } func TestFibo3(t *testing.T) { for i, v := range testArr { if actual := Fibo3(i); actual != v { t.Errorf("Fibo3(%v): got %v, expected %v\n", i, actual, v) } } }