跳台阶
来源:互联网 发布:js代码整理 编辑:程序博客网 时间:2024/06/14 20:29
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
提示:本题实质是斐波拉契数列问题,关于斐波拉契数列问题的解法,参考我的另一篇博客:斐波拉契数列
类似问题:变态跳台阶
/** * 解法二:递归思想——递归解法 * * 对于本题,前提只有1阶或者2阶的跳法。 * a. 如果两种跳法,1阶或者2阶。那么假定第一次跳的是1阶,那么剩下的是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为整数) */public class Solution { public static void main(String[] args) { Solution solution = new Solution(); System.out.print("请输入台阶数:"); @SuppressWarnings("resource") Scanner in = new Scanner(System.in); int floor = in.nextInt(); System.out.println(floor + "阶台阶共有 " + solution.JumpFloor(floor) + " 种跳法!"); } public int JumpFloor(int target) { return (target <= 2) ? target : JumpFloor(target-1) + JumpFloor(target-2); }}
/** * 解法二:递归思想——一般循环解法 * * 对于本题,前提只有1阶或者2阶的跳法。 * a. 如果两种跳法,1阶或者2阶。那么假定第一次跳的是1阶,那么剩下的是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为整数) */public class Solution { public static void main(String[] args) { Solution solution = new Solution(); System.out.print("请输入台阶数:"); @SuppressWarnings("resource") Scanner in = new Scanner(System.in); int floor = in.nextInt(); System.out.println(floor + "阶台阶共有 " + solution.JumpFloor(floor) + " 种跳法!"); } public int JumpFloor(int target) { int a = 1; int b = 2; int result = 0; if(target == 1) { result = 1; } else if(target == 2) { result = 2; } else { for(int i = 0; i < target - 2; i++) { result = a + b; a = b; b = result; } } return result; }}
/** * 解法三:排列组合——说实话,还是没太懂这种做法 * * 问题描述:青蛙可跳1-2级台阶,现在需要跳n个台阶,共有多少种跳法 * 问题解析:设共跳x个1级台阶,y个2级台阶,可推出x+2y=n --> x=n-2y, * 最终问题为对n-2y个一级台阶与y个二级台阶排列组合,即C(n-y,y)。 * y的范围:y>=0&&y<=(n/2) x的范围:x>=0&&x<=n-2y。 */public class Solution { public static void main(String[] args) { Solution solution = new Solution(); System.out.print("请输入台阶数:"); @SuppressWarnings("resource") Scanner in = new Scanner(System.in); int floor = in.nextInt(); System.out.println(floor + "阶台阶共有 " + solution.JumpFloor(floor) + " 种跳法!"); } public int JumpFloor(int target) { int two; // 跳两级台阶的次数 int count = 0; // 共有count中跳法 for (two = 0; two <= (target / 2); two++) { count += com(target - two, two); } return count; } // 从m中取n个进行排列组合 public int com(int m, int n) { int i = m; int j; int sum = 1; for (j = 0; j < n; j++, i--) { sum = sum * i / (j + 1); } return sum; }}
阅读全文
0 0