package jianzhioffer;
import java.util.Scanner;
/**
*
* @author Dan
* 斐波那契数列
*第3项开始,每一项都等于前两项之和
*/
public class fibonacci {
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
int x=s.nextInt();
long start1=System.currentTimeMillis();
System.out.println("第"+x+"项(递归):"+Fibonacci1(x));
System.out.println("递归用时:"+(System.currentTimeMillis()-start1));
long start2=System.currentTimeMillis();
System.out.println("第"+x+"项(递推):"+Fibonacci2(x));
System.out.println("递推用时:"+(System.currentTimeMillis()-start2));
}
//使用递归,但是当数字较大时,会发生栈的溢出,效率极低
private static long Fibonacci1(int x) {
if(x==0)
return 0;
if(x==1)
return 1;
return Fibonacci1(x-1)+Fibonacci1(x-2);
}
//使用递推
private static long Fibonacci2(int x) {
if(x==0)
return 0;
if(x==1)
return 1;
long one=1;
long two=0;
long fibN=0;
for (int i = 2; i <= x; i++) {
fibN=one+two;
two=one;
one=fibN;
}
return fibN;
}
}
运行结果:
30
第30项(递归):832040
递归用时:8
第30项(递推):832040
递推用时:0
40
第40项(递归):102334155
递归用时:821
第40项(递推):102334155
递推用时:0
问题:一只青蛙一次可以跳1级台阶,也可以跳2级,问跳n级台阶共有多少中跳法?
第1次跳:两种选择
第一种:只跳1级,跳法数目就是后面的n-1级台阶的跳法数目,即f(n-1)
第二种:跳2级,跳法就是后面的n-2级台阶的跳法数目,即f(n-2)
所以n级台阶的跳法就是这两种相加,也就是斐波那契数列的第n项
问题2:一只青蛙一次可以跳1级台阶,也可以跳2级,……也可以跳n级,问跳n级台阶共有多少中跳法?
f(n)=2^(n-1)