定义
F(n) = F(n-1) + F(n-2)
基于定义的算法
def fib(n)
return n if n == 0 || n == 1
fib(n-1) + fib(n-2)
end
fibonacci的展开是指数级别的(exponential), 所以基于定义的算法的复杂度也是指数级的 O(2^n)
优化基本定义的算法
当n=5时
fib(5) = fib(4) + fib(3)
fib(4) = fib(3) + fib(2)
fib(3) = fib(2) + fib(1)
可以看到 fib(3)和fib(2)都计算了两次, 也就是说在基于定义的算法会重复计算 n-1, n-2...2 的值
因此, 将这些重复的值缓存起来, 就可以将算法复杂度降低到线性 O(n)
def fib_fast(n, mem = {})
return n if n == 0 || n == 1
mem[n] ||= fib_fast(n-1, mem) + fib_fast(n-2, mem)
end