1 问题描述
1. 楼梯有n个台阶,上楼可以一步上1阶,也可以一步上2阶,一共有多少种上楼的方法?
斐波那契数列 第一项为1 第二项为2 也就是f(n)=f(n-1)+f(n-2),用递归求。
给个分析的例子:
有一个11级的台阶,一个人可走一步也可走两步,问这个人有多少种方法走完这个台阶?
解:
①只用一步走:1+1+1+1+1+1+1+1+1+1+1=11,共11步,只有C11,1=1种走法。
②用了一次两步走:1+1+1+1+1+1+1+1+1+2=11,共10步,有C10,1 =10种走法。
③用了两次两步走:1+1+1+1+1+1+1+2+2=11,共9步,有C9,2 =36种走法。
④用了三次两步走:1+1+1+1+1+2+2+2=11,共8步,有C8,3= 56种走法。
⑤用了四次两步走:1+1+1+2+2+2+2=11,共7步,有C7,4=35种走法。
⑥用了五次两步走:1+2+2+2+2+2=11,共6步,有C6,1=6种走法。
总共有1+10+36+56+35+6=144种
理论上分析:只有一个台阶的话,只有1种走法,2级台阶的话,可以一步一个台阶走,也可以一步2个台阶走,共有2种走法。
当台阶数大于等于3之后,可以这么分析:如果最后一步走一个台阶,那么就是n-1个台阶的走法的种类,如果最后一步走两个台阶,那么就是n-2个台阶的走法的种类,所以n个台阶的走法种类就是n-1个台阶和n-2个台阶的走法的总和。因此,这是一个递归函数。也是一个裴波那契函数。
2 实现
/**
*
* @author xld
*
*/
public class Solution2 {
private static int[] memo;
/**
* 动态规划
* @param n
* @return
*/
public static int climbStairs(int n) {
memo = new int[n+1];
for(int i=0;i<memo.length;i++)
memo[i]=-1;
memo[0]=1;
memo[1]=1;
for(int i=2;i<=n;i++){
memo[i]=memo[i-1]+memo[i-2];
}
return memo[n];
}
public static void main(String[] args) {
System.out.println(climbStairs(44));
}
}