青蛙问题:一只青蛙每次可以跳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];
}
}