Fibonacci数列的DP演算法(暴力法、Top-down、Bottom-up)
方法对比
- 暴力法:迭代
- Top-down:用数组记录之前求过的结果,省去大量重复计算
- Bottom-up:用for循环,从底部求到顶部
package leetcode_practise;
public class Fibonacci_DP {
public static int fib_recursive(int N) {
if (N == 1 || N == 2)
return 1;
else
return fib_recursive(N - 1) + fib_recursive(N - 2);
}
public static int fib_Top_Down(int N) {
if (N < 1) return 0;
int[] r =new int[N+1];
return fib_Top_Down_helper(r, N);
}
public static int fib_Top_Down_helper(int[] r, int N) {
if (N == 1 || N == 2) return 1;
if (r[N] != 0) return r[N];
r[N] = fib_Top_Down_helper(r, N - 1) + fib_Top_Down_helper(r, N - 2);
return r[N];
}
public static int fib_Bottom_Up(int N)
{
if (N == 2 || N == 1)
return 1;
int prev = 1, curr = 1;
for (int i = 3; i <= N; i++) {
int sum = prev + curr;
prev = curr;
curr = sum;
}
return curr;
}
public static void main(String[] args) {
System.out.println("方法一:递归 fib_recursive\n"+fib_recursive(7));
System.out.println("方法二:自顶向下递归算法 fib_Top_Down\n"+fib_Top_Down(7));
System.out.println("方法三:自底向上非递归算法 fib_Bottom_Up\n"+fib_Bottom_Up(7));
}
}