题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
思路
假设第一次跳了一阶,那么还剩 n-1 阶,有f(n-1)中跳法。 假设第一次跳了2阶,那么还剩 n-2 阶,有f(n-2)中跳法。所以,这是一个斐波那契数列。f(n) = f(n-1)+f(n-2)
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
|
public class JumpFloor { public int JumpFloorSolution(int target) { if (target == 0) { return 0; } if (target == 1) { return 1; } if (target == 2) { return 2; } int f1 = 1; int f2 = 2; int cursum = 0; for (int i = 3; i <= target; i++) { cursum = f1 + f2; f1 = f2; f2 = cursum; } return cursum; } }
|
题目2
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
思路
- 假设第一次跳 1 阶。那么还剩 n-1 阶。一共还剩f(n-1)种跳法。
- 假设第一次跳 2 阶。那么还剩 n-2 阶。一共还剩f(n-2)种跳法。 。。。
- 假设第一次跳 n-1 阶。那么还剩 1 阶。一共还剩f(1)种跳法。
- 假设第一次跳 n 阶。一种跳法。
- 所以:f(n) = f(n-1)+f(n-2)+…+1; 而且:f(n-1) = f(n-2) +…+1;
- 所以f(n) = 2f(n-1)
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
public class JumoFloor2 { public int JumpFloorSolution(int target) { if (target <= 0) { return 0; } if (target == 1) { return 1; } return JumpFloorSolution(target - 1) * 2; } }
|