/**
* 题目:
* 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
* */
/**
* 理解题意:
* a.两种跳法,1阶或者2阶,那么假定第一次跳的是一阶,那么剩下的是n-1个台阶,跳法是f(n-1);
* b.假定第一次跳的是2阶,那么剩下的是n-2个台阶,跳法是f(n-2)
* c.由a\b假设可以得出总跳法为: f(n) = f(n-1) + f(n-2)
* d.然后通过实际的情况可以得出:只有一阶的时候 f(1) = 1 ,只有两阶的时候可以有 f(2) = 2
* e.可以发现最终得出的是一个斐波那契数列:
*
* | 1, (n=1)
* f(n) = | 2, (n=2)
* | f(n-1)+f(n-2) ,(n>2,n为整数)
* */
/**
* 解题思路: 用迭代法。
* n=1;一阶只有一种跳法;
* n=2;二阶只有两种跳法:一次跳一级;一次跳两级;
* n>2;也就是初始台阶为3,向后迭代:
* 根据斐波那契数列:当前台阶的跳法总数=当前台阶后退一阶的台阶的跳法总数+当前台阶后退二阶的台阶的跳法总数
* */
public class JumpFloor {
public int jump(int target) {
if (target < 0) return -1;
if (target == 1 || target == 2) return target;
int jumpSum = 0;// 当前台阶的跳法总数, 如当前台阶为3
int jumpSumBackStep2 = 1;// 当前台阶的后退二阶的跳法总数, 后退二阶是1,那就是1种跳法
int jumpSumBackStep1 = 2;// 当前台阶的后退一阶的跳法总数, 后退一阶是2,那就是2种跳法
for (int i = 2; i < target; i++) {
// 根据斐波那契数列:
jumpSum = jumpSumBackStep2 + jumpSumBackStep1;// 当前台阶的跳法总数=当前台阶后退一阶的台阶的跳法总数+当前台阶后退二阶的台阶的跳法总数
jumpSumBackStep2 = jumpSumBackStep1;// 更新迭代:当前台阶的后退一阶下一次迭代变为后退二阶
jumpSumBackStep1 = jumpSum;// 更新迭代:当前台阶在下一次迭代变为后退一阶
}
return jumpSum;
}
public static void main(String[] args) {
JumpFloor jumpFloor = new JumpFloor();
int target = 5;
int jumpSum = jumpFloor.jump(target);
System.out.println(jumpSum);
}
}
输出:
8
/**
* 递归法
**/
int jumpFloor(int target) {
if(number <= 0)
return -1;
else if(target== 1 || target == 2)
return target;
else
return jumpFloor(number-1) + jumpFloor(number-2);
}