斐波拉契数列问题
题目描述:
斐波拉契数列问题:要求实现键盘输入一个数n,输出斐波拉契数列的第n项。斐波拉契数列定义:f(0)=0;f(1)=1;f(n)=f(n-1)+f(n-2);
解题思路:
按照斐波拉契地推公式很容易想到的方法就是采用递归来求解,但是递归方法存在很严重的效率问题;例如要求f(10),需要先求f(9)和f(8),同样要求f(9)必须先求f(8)和f(7),以此类推发现存在较多的重复。
更简单的方法就是从下往上计算,首先根据f(0)和f(1)算出f(2),再根据f(1)和f(2)算出f(3)…以此类推就可以算出第n项了。该方法的时间复杂度为o(n)
其实还有一种时间复杂度为o(logn)的方法,但是数学公式较为复杂,一般不够实用。
问题延伸:
青蛙跳台阶问题:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上n级台阶总共多少种跳法。
分析:
如果只有一级台阶,那么只有一种跳法;如果有2级台阶,那么就有两种跳法:分两次跳,每次跳1级;一次跳2级。那么该问题的结论是:
青蛙跳上n阶台阶的不同跳法是f(n)=f(n-1)+f(n-2)。
青蛙跳台阶升级版:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶…他也可以跳上n级台阶,此时该青蛙跳上n级台阶共有多少种跳法?f(n)=2^n-1。数学归纳法。。。
public class Code009 {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
System.out.println(fibonacci(n));
System.out.println(solution(n));
}
private static int fibonacci(int n){
if(n<=0){
return 0;
}
if(n==1){
return 1;
}
return fibonacci(n-1)+fibonacci(n-2);
}
private static int solution(int n){
if(n<=0){
return 0;
}
if(n==1){
return 1;
}
//定义初始n为0和n为1时的值,并用两个变量存储
int num0=0;
int num1=1;
int result=0;
for(int i=2;i<=n;i++){
//每一次计算完后立马更新变量的值
result=num0+num1;
num0=num1;
num1=result;
}
return result;
}
}