题目一:求斐波那契数列的第n项
写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。斐波那契数列的定义如下:
当n=0时,f(n)=0;
当n=1时,f(n)=1;
当n>1时,f(n)=f(n-1)+f(n-2);
从下往上计算,首先根据 f(0)和 f(1)算出 f(2),再根据 f(1)和 f(2)算出 f(3)……以此类推就可以算出第n项了。这种方法把递归的算法用循环实现,极大的提高了时间效率。时间复杂度为 O(n)。
类似,青蛙跳台阶问题。如果只有1级台阶,那显然只有一种跳法。如果有2级台阶,有两种跳法:一种分两次,每次跳1级;另一种就是一次跳2级。抽象成f(n),当n>2时,那么第一次跳的时候就有两种不同的选择。跳1级,和f(n-1)同;跳2级,和f(n-2)同。即f(n)=f(n-1)+f(n-2)。
java实现代码如下:
package chapter2;
public class P74_Fibonacci {
public static long fibonacci1(int n){//递归
if(n<=0)
return 0;
if(n==1)
return 1;
return fibonacci1(n-1)+fibonacci1(n-2);
}
public static long fibonacci2(int n){//非递归
if(n<=0)
return 0;
if(n==1)
return 1;
int a=0,b=1,f=0;
for(int i=2;i<=n;i++){
f=b+a;
a=b;//先与下一步
b=f;
}
return f;
}
public static void main(String[] args) {
long start,end;
start=System.currentTimeMillis();
long value=fibonacci2(40);
end=System.currentTimeMillis();
System.out.println(value);
System.out.println(end-start);
}
}
非递归的方法,从下往上计算,代码实现如下:
long long Fibonacci(unsigned int n)
{
int result[2]={0,1};
if(n<2) return result[n];
long long fibNMinusOne=1;
long long fibNminusTwo=0;
long logn fibN=0;
for(unsigned int i=2;i<=n;++i)
{
fibN=fibNMinusOne+fibNminusTwo;
fibNminusTwo=fibNMinusOne;
fibNMinusOne=fibN;
}
return fibN;
}
测试用例:
a.功能测试(如输入3、5、10等)。
b.边界值测试(如输入0、1、2)。
c.性能测试(输入较大的数字,如40、50、100等)。
类似题:青蛙跳台阶问题
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个n级的台阶总共有多少种跳法。