斐波那契数列(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)
}
}
}