go语言之斐波那契数列的几种实现方法
斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、……在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)
在学习go语言基础的过程中,学习了斐波那契数列的几种实现方法,总的可以分为递归和非递归实现。本文按照用到的方法侧重点不同,现细分如下:
- 递归实现
- 递归实现改进
- 数组递归实现
- 闭包实现
递归实现
package main
import "fmt"
const LIM = 40
func main() {
//result := 0
//var array []int
var array [LIM]int
for i := 0; i < LIM; i++ {
array[i] = fibonacci(i)
//result = fibonacci(i)
//array = append(array, result)
//fmt.Printf("fibonacci(%d) is: %d\n", i, result)
}
fmt.Println(array)
}
func fibonacci(n int) (res int) {
if n <= 1 {
res = 1
} else {
res = fibonacci(n-1) + fibonacci(n-2)
}
return
}
递归实现改进
package main
import "fmt"
const LIM = 40
var fibs [LIM]uint64
func main() {
//var result uint64 = 0
var array [LIM]uint64
for i := 0; i < LIM; i++ {
array[i] = fibonacci(i)
//result = fibonacci(i)
//array = append(array, result)
//fmt.Printf("fibonacci(%d) is: %d\n", i, result)
}
fmt.Println(array)
}
func fibonacci(n int) (res uint64) {
// memoization: check if fibonacci(n) is already known in array:
if fibs[n] != 0 {
res = fibs[n]
return
}
if n <= 1 {
res = 1
} else {
res = fibonacci(n-1) + fibonacci(n-2)
}
fibs[n] = res
return
}
数组递归实现
package main
import "fmt"
const LIM = 40
func main() {
fmt.Println(fibarray(LIM))
}
func fibarray(term int) []int {
farr := make([]int, term)
farr[0], farr[1] = 1, 1
for i:= 2; i < term; i++ {
farr[i] = farr[i-1] + farr[i-2]
}
return farr
}
闭包实现
package main
import "fmt"
const LIM = 40
func main() {
f := fibonacci() //返回一个闭包函数
var array [LIM]int
for i := 0; i < LIM; i++ {
array[i] = f()
}
fmt.Println(array)
}
func fibonacci() func() int {
back1, back2 := 0, 1
return func() int {
// 重新赋值
back1, back2 = back2, (back1 + back2)
return back1
}
}
小结
总体来说,用time包可以测试几种实现方法所用时间,对比得出递归实现会比闭包实现耗时更长,效率远远低于非递归实现。
参考链接:
https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/examples/