递归的性能测试

先看一段熟悉的代码

package main
import (
    "fmt"
    "time"
)
func main() {
    result := 0
    start := time.Now()
    for i := 1; i <= 40; i++ {
        result = fibonacci(i)
        fmt.Printf("数列第 %d 位: %d\n", i, result)
    }
    end := time.Now()
    delta := end.Sub(start)
    fmt.Printf("程序的执行时间为: %s\n", delta)
}
func fibonacci(n int) (res int) {
    if n <= 2 {
        res = 1
    } else {
        res = fibonacci(n-1) + fibonacci(n-2)
    }
    return
}

感觉执行应该会很快
但是执行结果很慢 ,如下:
``shell
数列第 1 位: 1
数列第 2 位: 1
数列第 3 位: 2
数列第 4 位: 3
数列第 5 位: 5
数列第 6 位: 8
数列第 7 位: 13
数列第 8 位: 21
数列第 9 位: 34
数列第 10 位: 55
数列第 11 位: 89
数列第 12 位: 144
数列第 13 位: 233
数列第 14 位: 377
数列第 15 位: 610
数列第 16 位: 987
数列第 17 位: 1597
数列第 18 位: 2584
数列第 19 位: 4181
数列第 20 位: 6765
数列第 21 位: 10946
数列第 22 位: 17711
数列第 23 位: 28657
数列第 24 位: 46368
数列第 25 位: 75025
数列第 26 位: 121393
数列第 27 位: 196418
数列第 28 位: 317811
数列第 29 位: 514229
数列第 30 位: 832040
数列第 31 位: 1346269
数列第 32 位: 2178309
数列第 33 位: 3524578
数列第 34 位: 5702887
数列第 35 位: 9227465
数列第 36 位: 14930352
数列第 37 位: 24157817
数列第 38 位: 39088169
数列第 39 位: 63245986
数列第 40 位: 102334155
数列第 41 位: 165580141
数列第 42 位: 267914296
数列第 43 位: 433494437
数列第 44 位: 701408733
程序的执行时间为: 6.36509246s

当40改为50的时候,几乎已经无法等到结果了
改进的代码如下:
```go
package main
import (
    "fmt"
    "time"
)
const LIM = 41
var fibs [LIM]uint64
func main() {
    var result uint64 = 0
    start := time.Now()
    for i := 1; i < LIM; i++ {
        result = fibonacci(i)
        fmt.Printf("数列第 %d 位: %d\n", i, result)
    }
    end := time.Now()
    delta := end.Sub(start)
    fmt.Printf("程序的执行时间为: %s\n", delta)
}
func fibonacci(n int) (res uint64) {
    // 记忆化:检查数组中是否已知斐波那契(n)
    if fibs[n] != 0 {
        res = fibs[n]
        return
    }
    if n <= 2 {
        res = 1
    } else {
        res = fibonacci(n-1) + fibonacci(n-2)
    }
    fibs[n] = res
    return
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

micro_cloud_fly

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值