习题1、一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
思路分析:跳上第n级台阶的最后一跳只存在两种情况(跳1级或2级),一种是从第n-1级跳1级到第n级,另一种是从第n-2级跳2级到第n级。假如我们用f(n)代表青蛙跳上一个n级的台阶的跳法总数,则当n要大于2时有f(n) = f(n-1) + f(n-2),原来这是一个裴波那契数列求和问题,代码如下。
public static int jump(int n) { // n: 大于等于0的整数 int[] fib = { 0, 1, 2 }; if (n <= 2) { return fib[n]; } return jump(n - 1) + jump(n - 2); }
习题2、一只青蛙一次可以跳上任意级的台阶。求该青蛙跳上一个n级的台阶总共有多少种跳法。
思路分析:跳上第n级台阶的最后一跳存在n种情况(跳1级、或2级、……、或n级),第一种是从第n-1级跳1级到第n级,第二种是从第n-2级跳2级到第n级,第n种是从第0级跳n级到第n级。假如我们用f(n)代表青蛙跳上一个n级的台阶的跳法总数,则f(n) = f(n-1) + f(n-2)+……+f(0)。先通过数学推理得到公式,然后就容易写代码了。
f(n) = f(n-1) + f(n-2)+……+f(0) >> f(n+1) = f(n) + f(n-1)+……+f(0) >> f(n+1)-f(n) = (f(n) + f(n-1)+……+f(0)) – (f(n-1) + f(n-2)+……+f(0)) >> f(n+1) = 2f(n) |
public static int jump2(int n) { // n: 大于等于0的整数 if (n == 0) return 0; if (n == 1) return 1; return 2 * jump2(n - 1); }