青蛙问题:一只青蛙每次可以跳2个或者3个台阶,问如果跳1000个台阶总共有多少种跳法?
抽象:f(1)=0,f(2)=1,f(3)=1,f(n)=f(n-2)+f(n-3)(当n>3时),求f(1000)
思路:要知道f(1000)只需要知道f(998)与f(997),要知道f(998)只需要知道f(996)与f(995)……最后分解到f(1),f(2),f(3),这是已知的,f(1000)就能求出来了。
代码如下:
package test; /** * 分治法 * @author yanghang * */ public class Fenzhi { public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(g(1000)); } /** * 使用递归实现,代码简洁但执行效率低,因为有大量重复的运算 * @param n * @return */ public static int f(int n) { if (n <= 1) return 0; if (n == 2 || n == 3) return 1; return f(n - 2) + f(n - 3); } /** * 使用递推法,执行效率高 * @param n * @return */ public static int g(int n) { if (n <= 1) return 0; if (n == 2 || n == 3) return 1; int r[] = new int[n + 1]; r[1] = 0; r[2] = 1; r[3] = 1; for (int i = 4; i <= n; i++) { r[i] = r[i-2] + r[i-3]; } return r[n]; } }