最近补下动规跟递归。介绍动规的一个思路是先分析之前的一些通过递归解决的一些问题,判断他们在计算的过程中是否出现了过多的子问题的覆盖,如果覆盖了很多相同的结果那么计算势必要浪费很多时间在做无用功。动规采用自底向上的思路求解,一般在O(n2),O(n3)的复杂度内能够给出答案。实现的思路是先给出递归的解法,然后给出动规的解法。
今天先以fibonacci 为例:
代码:
package codes;
public class FibonacciDemo {
public static void main(String[] args) {
System.out.println(new FibonacciDemo().recursiveFib(3));
System.out.println(new FibonacciDemo().recursiveFib(5));
System.out.println(new FibonacciDemo().memoizedFib(3));
System.out.println(new FibonacciDemo().memoizedFib(5));
}
public int recursiveFib(int n){
if(n == 1 || n == 2){
return 1;
}else{
return recursiveFib(n-1) +recursiveFib(n-2);
}
}
public int memoizedFib(int n){
if (n==0) return 0;
if( n == 1 || n ==2){
return 1;
}
int [] array = new int [n+1]; // 存储最优子问题的解
array [1] = 1;
array [2] = 1;
for(int i=3;i<=n;i++){
array[i] = array[i-1]+array[i-2];
}
return array[n];
}
}