思路:
不会。
答案:
法1:递归
当n=1时,只需跳一次,因此f(1)=1
当n=2时,可以先跳一级再跳一级,也可以直接跳两级,因此可以记作f(2)=2
当n=3时,可以从一级台阶跳两步,也可以二级台阶跳1步,因此是f(3)=f(2)+f(1)
...
同理,n级台阶有f(n)=f(n-1)+f(n-2)种跳法(n>2时)
public static int JumpFloor(int n){ if(n<3){ return n; }else{ return JumpFloor(n-1)+JumpFloor(n-2); } }
法2:非递归,减少重复计算
由于递归产生了很多重复计算,若是有重复的不计算直接拿结果,就能减少不少时间
这个方法采用一个数组,记录计算过的f(n)
public int JumpFloor(int n){ if(n<=1) return 1; int[] dp = new int[n+1]; dp[1]=1;//n=1和n=2的时候f(n)都是1 dp[2]=1; for(int i = 3;i<=n;i++){ dp[i] = dp[i-1]+dp[i-2];//dp[n]记录的数值就是f(n)的值 } return dp[n]; }
3.优化方法2
因为上面那个用数组存储f(n)的方法,主要是依赖当前n的前两个值,n-1和n-2,因此只需要两个临时变量可以替换掉数组
public int JumpFloor(int n){ if(n<2) return n; int first = 1,second = 2,sum =0; while(n-- >2){ sum = first + second;//first就是f(n-1)的值,second就是f(n-2)的值 first = second; second = sum;//替换掉之后,下一次又相加 } return sum; }
4.公式计算(变态)
public static int JumpFloor(int n) { double sqrt = Math.sqrt(5); return (int) ((Math.pow((1 + sqrt) / 2, n + 1) - Math.pow((1 - sqrt) / 2, n + 1)) / sqrt); }