注意事项:
- 百科给出的解释是F(1)=1, F(2)=1,不是F(1)=0, F(2)=1
- 最好定义为int64类型,避免数据过大而异常
- 为了精确显示测试时间,统一用纳秒,转换单位前注意转换为float64类型,否则可能只显示0
package main
import (
"fmt"
"time"
)
// 方法一:递归
func Fibonacci1(n int64) int64 {
if n == 0 || n == 1 {
return n
} else if n > 1{
return Fibonacci1(n-2) + Fibonacci1(n-1)
} else {
fmt.Println("输入错误,请重新输入!")
return 0
}
}
// 方法二:利用中间值传递循环,效率更高
func Fibonacci2(n int64) int64 {
if n == 0 || n == 1 {
return n
} else if n > 1 {
var first int64 = 0
var second int64 = 1
var i int64
var sum int64
for i = 1; i <= n-1; i++ {
sum = first + second
first = second
second = sum
}
return second
} else {
fmt.Println("输入错误,请重新输入!")
return 0
}
}
func main() {
var n int64
fmt.Println("请输入序列号n: ")
fmt.Scanln(&n)
//测试时间
beginTime1 := time.Now().UnixNano()
fmt.Println("result1=",Fibonacci1(n))
endTime1 := time.Now().UnixNano()
costTime1 := endTime1 - beginTime1
fmt.Printf("测试函数1花费时间costTime1=%v秒\n",float64(costTime1)/1000000000)
beginTime2 := time.Now().UnixNano()
fmt.Println("result2=",Fibonacci2(n))
endTime2 := time.Now().UnixNano()
costTime2 := endTime2 - beginTime2
fmt.Printf("测试函数2花费时间costTime2=%v秒",float64(costTime2)/1000000000)
fmt.Println()
}
原文:https://www.cnblogs.com/levin-ling/p/13405598.html