斐波那契数列:
0,1,1,2,3,5,8,13,21 …
分析数列可以得出第n列的值等于前两列的值相加的结果。
它的数学公式为:F(0) = 0 F(1) = 1 F(n) = F(n-1) + F(n-2),(n>=2)
求第n列的斐波那契值的方法:
- 用递归方式(时间复杂度O(2^N)):
func fibo(n int) int {
if n <= 0 {
return 0
} else if n == 1 {
return 1
} else {
return fibo(n-1) + fibo(n-2)
}
}
这种方式易于理解但是效率很低,因为求n列的时候必须先得出n-1和n-2列的值,而n-1列的值又是由前两列的值相加得出,很多值都会重复计算。这种重复计算会随着n的增加成几何倍增长。
2. 非递归实现(时间复杂度O(N),空间复杂度O(N))
定义一个数组,从第2列开始,每列的值都等于前两列的值相加。
// fibonacci 非递归实现,借助数组
func fibonacci(n int) int {
if n <= 0 {
return 0
} else if n == 1 {
return 1
} else {
arr := make([]int, n+1)
arr[0] = 0
arr[1] = 1
for i := 2; i <= n; i++ {
arr[i] = arr[i-1] + arr[i-2]
}
fmt.Println(arr)
return arr[n]
}
}
- 非递归实现(时间复杂度O(N),空间复杂度O(1))
// fibonacci2 用变量保存两个要加的值
func fibonacci2(n int) int {
if n <= 0 {
return 0
} else if n == 1 {
return 1
} else {
first := 0
second := 1
res := 1
for i := 2; i <= n; i++ {
res = first + second
first = second
second = res
}
return res
}
}