Fibonacci数列直接采用递归的方法计算时会造成大量的重复计算,如在计算fib(6)时,计算步骤如下图所示:

从上图可以看到,颜色相同的都是重复计算,当n越大,重复的越多,所以我们可以使用一个map把计算过的值存起来,每次计算的时候先看看map中有没有,如果有就表示计算过,直接从map中取,如果没有就先计算,计算完之后再把结果存到map中。

使用golang实现如下:

package main

import "fmt"

func main() {
    cache := make(map[nt64]64)
    for i := int64(1); i < 100; i++ {
        if i == 93 {
            fmt.Printf("%d + %d = %d ??? wired, what happened?\n", cache[92], cache[91], cache[92] + cache[91])
        }
        fmt.Println(fib(i, cache))
    }
}

func fib(n int64, cache map[int64]int64) int64 {
    if n == 1 || n == 2 {
        return 1
    }
    if cache[n] == 0 {
        cache[n] = fib(n-1, cache) + fib(n-2, cache)
    }
    return cache[n]
}

Reference

https://leetcode-cn.com/problems/fibonacci-number/solution/di-gui-he-fei-di-gui-liang-chong-fang-shi-du-ji–2/