题目
原文:
Write a method to generate the nth Fibonacci number.
译文:
写一个方法产生第n个斐波那契数。
解答
斐波那契数列(又称黄金分割数列)指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...
特别指出:0是第0项,不是第1项。
这个数列从第二项开始,每一项都等于前两项之和。所以斐波纳契数列的递归形式为:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*),是一个线性递归数列,其通项公式为:
递归版本:
public static long fib0(long n){
if(n<0) return -1;
if(n==0) return 0;
if(n==1) return 1;
else return fib0(n-1)+fib0(n-2);
}
公式版:
public static double fib1(int n){
double gh5=java.lang.StrictMath.sqrt((double)5);
return (java.lang.StrictMath.pow((1+gh5),n)-java.lang.StrictMath.pow((1-gh5),n))/(java.lang.StrictMath.pow((double)2,n)*gh5);
}
迭代法:
public static long fib2(long n){
if(n<0) return -1;
if(n==0) return 0;
int a=1;
int b=1;
for(int i=3;i<=n;i++){
int c=a+b;
a=b;
b=c;
}
return b;
}
完整代码:
//import java.lang.StrictMath;
class Q8_1{
//递归方法
public static long fib0(long n){
if(n<0) return -1;
if(n==0) return 0;
if(n==1) return 1;
else return fib0(n-1)+fib0(n-2);
}
//公式法
public static double fib1(int n){
double gh5=java.lang.StrictMath.sqrt((double)5);
return (java.lang.StrictMath.pow((1+gh5),n)-java.lang.StrictMath.pow((1-gh5),n))/(java.lang.StrictMath.pow((double)2,n)*gh5);
}
//迭代法
public static long fib2(long n){
if(n<0) return -1;
if(n==0) return 0;
int a=1;
int b=1;
for(int i=3;i<=n;i++){
int c=a+b;
a=b;
b=c;
}
return b;
}
public static void main(String[] args){
System.out.println(fib0(7)+"");
System.out.println(fib1(7)+"");
System.out.println(fib2(7)+"");
}
}
---EOF---