内存缓存与动态规划

先来看1个动态规划的概念:

任何数学递归公式都可以直接翻译成递归算法,但是基本现实是编译器常常不能正确对待递归算法,结果导致低效的算法(没错说的就是递归)。当我们怀疑很可能是这种情况时,我们必须再给编译器一些帮助,将递归算法重新写成非递归算法,将后者把那些子问题的答案系统的记录在一个表内。利用这种方法的一种技巧就叫做动态规划(dynamic programming)。

这一小节讲到的 【要计算数列中第 n 个数字,需要先得到之前两个数的值】就是上述的子问题, 【第 n 个数的值存在数组中索引为 n 的位置】即那些子问题的答案系统的记录在一个表内。

当然了这里并没有将递归算法重写成非递归算法,只是用数组避免了重复计算,性能的提升已经爆炸了, 因为递归算法中,子问题的计算是指数增长的。 有兴趣的同学可以深入研究一下,这里就不展开了 :)

下面给出一个线性斐波那契数列算法

 package main

 import "fmt"
 func main() {
     fmt.Println(fibonnaci(10))
 }

 func  fibonnaci( limit int) (ret int) {
      if limit  <= 1 {
         return 1
     }
     last , nextToLast := 1 , 1

     var answer int
     for i := 2; i < limit; i++ {
         answer =  last + nextToLast;
         nextToLast = last
         last = answer
     }
     return answer
 }
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!