题目:有n步台阶,一次只能上1步或者2步,共有多少种走法
递归
- 递归分析:
| 台阶数 | 备注 | 走法数 |
|---|---|---|
| 1 | 走1步,f(1) = 1 | 1 |
| 2 | 1步+1步||2步,f(2) = 2 | 2 |
| 3 | 最后可以走1步或者两步,相当于f(2) + 1步 或者 f(1) + 2步 | f(1) + f(2) |
| n | 最后可以走1步或者两步,相当于f(n-2) + 2步 或者 f(n-1) + 1步 | f(n-1) + f(n-2) |
- 递归代码实现:
public class Demo {
public static void main(String[] args) {
long start = System.currentTimeMillis();
System.out.println("走法:" + f(40));
long end = System.currentTimeMillis();
System.out.println("耗时:" + (end - start) + "ms");
}
public static int f(int n) {
if (n < 1) {
throw new IllegalArgumentException("n不能小于1");
}
if (n == 1 || n == 2) {
return n;
}
return f(n - 2) + f(n - 1);
}
}
- 递归结果:
走法:165580141
耗时:308ms
迭代
- 迭代分析:
lastOneNum–保存最后走一步之前的步数
lastTwoNum–保存最后走两步之前的步数
| 台阶数 | 备注 | 走法数 |
|---|---|---|
| 1 | 1步 | f(1) = 1 |
| 2 | 1步+1步||直接2步, | f(2) = 2 |
| 3 | (1)先到达f(1),然后从f(1)跨2步 (2)先到达f(2),然后从f(2)跨1步 | f(3) =lastTwoNum+lastOneNum f(3)=f(1) +f(2) lastTwoNum=f(1);lastOneNum=f(2) |
| 4 | (1)先到达f(2),然后从f(2)跨2步 (2)先到达f(3),然后从f(3)跨1步 | f(4) =lastTwoNum+lastOneNum f(4)=f(2) +f(3) lastTwoNum=f(2);lastOneNum=f(3) |
- 迭代代码:
public class Demo {
public static void main(String[] args) {
long start = System.currentTimeMillis();
System.out.println("走法:" + f2(40));
long end = System.currentTimeMillis();
System.out.println("耗时:" + (end - start) + "ms");
}
public static int f2(int n) {
if (n < 1) {
throw new IllegalArgumentException("n不能小于1");
}
if (n == 1 || n == 2) {
return n;
}
int lastTwoNum = 1; //初始化为走到第一级台阶的走法
int lastOneNum = 2; //初始化为走到第二级台阶的走法
int sum = 0;
for (int i = 3; i <= n; i++) {
sum = lastTwoNum + lastOneNum;//例如:3个台阶走法=走到1级台阶(剩2级)走法+走到2级(剩1级)台阶走法
lastTwoNum = lastOneNum;//当i+1后,剩2级走法=之前剩1级台阶的走法
lastOneNum = sum;//当i+1后,剩1级台阶走法=之前走法总数
}
return sum;
}
- 迭代结果
走法:165580141
耗时:0ms
5703

被折叠的 条评论
为什么被折叠?



