Cracking the coding interview--Q8.1

题目

原文:

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---



你可能感兴趣的:(待优化)