剑指offer青蛙跳台阶问题
(1)一只青蛙一次可以跳上 1 级台阶,也可以跳上2 级。求该青蛙跳上一个n 级的台阶总共有多少种跳法。

//递归方式
public static int f(int n) {//参数合法性验证if (n < 1) {System.out.println("参数必须大于1!");System.exit(-1);}if (n == 1 || n == 2) return 1;else return f(n - 1) + f(n - 2);}
//非递归方式
public static int fx(int n) {//参数合法性验证if (n < 1) {System.out.println("参数必须大于1!");System.exit(-1);}//n为1或2时候直接返回值if (n< 2) return 1;//n>2时候循环求值int res = 0;int a = 1;int b = 1;for (int i = 2; i <= n; i++) {res = a + b;a = b;b = res;}return res;}
(2)一只青蛙一次可以跳上1级台阶,也可以跳上2 级……它也可以跳上n 级,此时该青蛙跳上一个n级的台阶总共有多少种跳法?
当n = 1 时, 只有一种跳法,即1阶跳:Fib(1) = 1;
当n = 2 时, 有两种跳的方式,一阶跳和二阶跳:Fib(2) = Fib(1) + Fib(0) = 2;
当n = 3 时,有三种跳的方式,第一次跳出一阶后,后面还有Fib(3-1)中跳法; 第一次跳出二阶后,后面还有Fib(3-2)中跳法;第一次跳出三阶后,后面还有Fib(3-3)中跳法
Fib(3) = Fib(2) + Fib(1)+Fib(0)=4;
当n = n 时,共有n种跳的方式,第一次跳出一阶后,后面还有Fib(n-1)中跳法; 第一次跳出二阶后,后面还有Fib(n-2)中跳法..........................第一次跳出n阶后, 后面还有 Fib(n-n)中跳法.
Fib(n) = Fib(n-1)+Fib(n-2)+Fib(n-3)+..........+Fib(n-n)=Fib(0)+Fib(1)+Fib(2)+.......+Fib(n-1)
又因为Fib(n-1)=Fib(0)+Fib(1)+Fib(2)+.......+Fib(n-2)
两式相减得:Fib(n)-Fib(n-1)=Fib(n-1) =====》 Fib(n) = 2*Fib(n-1) n >= 2
递归等式如下:

if(number<2)return 1;//n>2时候循环求值int res = 0;int a = 1;for (int i = 2; i <= number; i++) {res = 2*a;a= res;}return res;
浙公网安备 33010602011771号