[算法]计算斐波拉契数列
简单的递归方法
使用递归计算斐波拉契数列,写起来简单。
由于没保存中间结果,所以每一步都要重复计算,超过40就会变慢。
func Fib1(n uint) uint {
// version1, 计算斐波拉契数列
// 使用递归。超过40后,由于重复计算就会很慢
if n == 1 || n == 2 {
return 1
}
return (Fib1(n-2) + Fib1(n-1))
}
使用数组保存中间结果
使用数组保存中间结果,避免了重复计算。
func Fib2(n uint) uint {
// version2, 计算斐波拉契数列
// 时间复杂度O(N),空间复杂度O(1)
if n == 1 || n == 2 {
return 1
}
// 将中间结果保存在数组中,避免重复计算
var fibarr = [3]uint{0,1,0}
var j uint = 2
for ; j <= n; j++ {
fibarr[2] = fibarr[0] + fibarr[1]
fibarr[0] = fibarr[1]
fibarr[1] = fibarr[2]
}
return fibarr[2]
}
完整示例代码
go实现
package main
import (
"fmt"
"time"
)
func Fib1(n uint) uint {
// version1, 计算斐波拉契数列
// 使用递归。超过40后,由于重复计算就会很慢
if n == 1 || n == 2 {
return 1
}
return (Fib1(n-2) + Fib1(n-1))
}
func Fib2(n uint) uint {
// version2, 计算斐波拉契数列
// 时间复杂度O(N),空间复杂度O(1)
if n == 1 || n == 2 {
return 1
}
// 将中间结果保存在数组中,避免重复计算
var fibarr = [3]uint{0,1,0}
var j uint = 2
for ; j <= n; j++ {
fibarr[2] = fibarr[0] + fibarr[1]
fibarr[0] = fibarr[1]
fibarr[1] = fibarr[2]
}
return fibarr[2]
}
func main() {
startTime := time.Now()
var i uint = 1
for ; i < 10; i++ {
fmt.Printf("%d, %d\n",i,Fib2(i))
}
endTime := time.Since(startTime)
fmt.Println("计算用时",endTime)
}
python实现
from time import time
def fib1(number: int) -> int:
if number == 1 or number ==2:
return 1
return fib1(number-2) + fib1(number-1)
def fib2(number: int) -> int:
if number == 1 or number ==2:
return 1
fibarr = [0,1,0]
j = 2
while j <= number:
fibarr[2] = fibarr[0] + fibarr[1]
fibarr[0] = fibarr[1]
fibarr[1] = fibarr[2]
j += 1
return fibarr[2]
if __name__ == '__main__':
start_time = time()
print(fib1(40))
end_time = time()
print(f"fib1 耗时 {(end_time - start_time):.4f} seconds")
start_time2 = time()
print(fib2(40))
end_time2 = time()
print(f"fib2 耗时 {(end_time2 - start_time2):.4f} seconds")
本文来自博客园,作者:花酒锄作田,转载请注明原文链接:https://www.cnblogs.com/XY-Heruo/p/16505491.html