斐波那契數列(遞歸與非遞歸算法)

斐波那契數列,又稱黃金分割數列,指的是這樣一個數列:0、一、一、二、三、五、八、1三、2一、……在數學上,斐波納契數列以以下被以遞歸的方法定義:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)在現代物理、準晶體結構、化學等領域,斐波納契數列都有直接的應用。java

學習遞歸算法的時候通常都會了解這個數列,以此做爲例子來研究。算法

我學習算法這些也都是自學,因此第一次接觸遞歸併非這個例子,並且我到如今也不是很瞭解遞歸算法的過程。因此,以至我接觸到斐波那契數列的時候直接用循環的方式寫出來了,以後的學習的發現這樣的速度比遞歸實現快,是對遞歸算法速度的改進算法,頓時對本身不熟悉遞歸而感到也不是那麼次啊......數組

下面給出遞歸的算法:學習

package org.zsl.algorithm.fibonacci;

public class Fibonacci1 {
	//斐波那契數列中的遞歸	
	public static void main(String[] args) {
		System.out.println(fibonacci(40));
	}
	//遞歸調用
	public static int fibonacci(int n){	//此算法在N=40時出現明顯卡頓
		if(n==0) return 0;
		if(n==1) return 1;
		return fibonacci(n-1)+fibonacci(n-2);
	}
}


這是我本身寫的非遞歸的算法:

package org.zsl.algorithm.fibonacci;

public class Fibonacci2 {
	public static void main(String[] args) {
		System.out.println(fibonacci2(46));
	}
	public static int fibonacci2(int N){	//此算法速度較快,N=46時也不卡頓,N=47時超過了int範圍
		
		int[] arr = new int[N+1];	//數組從0開始,若想要一個數組有a[9],在聲明時必須是int[] a = new int[10];這樣纔會有a[9]
		arr[0] = 0 ;
		arr[1] = 1 ;
		if( N==0 ) return 0;
		if(N==1) return 1;
		if(N>1){
			for(int i = 2;i<=N;i++)
				arr[i] = arr[i-1]+ arr[i-2];
		}
		return arr[N];
		
	}
}
相關文章
相關標籤/搜索