今天遇到个面试题,要我用递归写出1,1,2,3,5,8,13,21,34·········
在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2)
public class FibonacciSequence {
//递归
public static int fibonacci(int n){
if(n==1){return 1;}
if(n==2){return 1;}
return fibonacci(n-1)+fibonacci(n-2);
}
//非递归1
public static int fibonacci1(int n){
int[] arr = new int[n+1];
arr[0]=1;
arr[1]=1;
for(int i=2;i<=n;i++){
arr[i]=arr[i-1]+arr[i-2];
}
return arr[n-1];
}
//非递归2
public static int fibonacci2(int n){
int a=1;
int b=1;
int c=1;
for(int i=3;i<=n;i++){
c=a+b;
a=b;
b=c;
}
return c;
}
public static void main(String[] args) {
for(int i=1;i<60;i++){
System.out.println("递归方法,第"+i+"个,值="+fibonacci(i));
System.out.println("非递归方法1,第"+i+"个,值="+fibonacci1(i));
System.out.println("非递归方法2,第"+i+"个,值="+fibonacci2(i));
}
}
}
执行时明显发现递归方法40之后执行相对缓慢,非递归方法执行都相当快速。
结论:JAVA描述斐波那契数列,更适合使用非递归方法的形式计算