我们都知道斐波那契数列: 0, 1, 1, 2, 3, 5, 8, …
那么问题来了,我们Java怎么求?
递推公式为:
fib(n) = fib(n-1) + fib(n-2), 当 n > 1时,已知 fib(0) = 0, fib(1) = 1.
首先,我们可以用递归来写,非常直观:
class Fibo {
public int fib(int n) {
// base case
if (n < 2) return n;
// recursion rule
return fib(n - 1) + fib(n - 2);
}
}
上面的代码直观且简单,为啥要用Dynamic Programming这么复杂而又难理解的写法?
我们来看看递归的问题出在哪里。
递归的问题在于,计算过程中有出现了很多重复计算。
比如我们要计算 fib(4),整个的执行过程是这样的:
fib(4)
/ \
fib(3) fib(2)
/ \ / \
fib(2) fib(1) fib(1) fib(0)
/ \
fib(1) fib(0)
我们会发现这个过程中fib(2)算了两次, fib(1)算了三次。可以想象n比较大的时候,这种重复计算就不得了了。
用计算机的语言来说就是时间复杂度很高。量化的话就是 O