跳台阶:
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
化为斐波那契数列问题:
能到达n的有n-1和n-2这两种情况:
intjumpFloor(intnumber) {
if( number == 0) return0;
if( number == 1) return1;
if( number == 2) return2;
returnjumpFloor(number -1) + jumpFloor( number -2);
}
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
这时能到达n的有n中情况。
int jumpFloorII(int number) {
int num = 0;
if(number == 0) return 1;
if(number == 1) return 1;
if(number == 2) return 2;
for(int i =1;i<=number;i++)
num += jumpFloorII(number-i);
return num;
}
2016年5月18日增改,对于一个斐波那契数列问题,如果用递归问题,容易造成堆栈溢出。因为递归函数不知道F(1)和F(0)的值,所以会重复计算很多次。例如:
f( 4 ) = f( 3 ) + f( 2 )
f( 4 )= f( 2 ) + f( 1 ) + f(1) + f(0)
f( 4 )= f( 1) +f( 0 ) + f(1)+ f(1)+ f(0)
在f(4)这,f(1)已经计算了3次,f(0) 计算了2次
用迭代的方法可以解决这个问题:
int fn1 = 1;
int fn0 = 0;
if( 0 == n ) return 0;
if( 1 == n ) return 1;
int cur = 0;
for(int i=2;i<=n;++i){
cur = fn1+fn0;
fn0 = fn1;
fn1 = cur;
}
return cur;
还可以用空间换时间:
if(n<=1){
return n;
}
int[] record = new int[n+1];
record[0] = 0;
record[1] = 1;
for(int i=2;i<=n;i++){
record[i] = record[i-1] + record[i-2];
}
return record[n];