菲波那切數列(Java)

題目:

寫一個函數,輸入n,求斐波那契(Fibonacci)數列的第n項。斐波那契數列的定義如下:

參考:https://blog.csdn.net/u013132035/article/details/80553875

package demo1;

import java.util.Scanner;

public class Test1 {

	public static void main(String[] args) {

		// 1.斐波那契數列
		/**
		 * n=0,f(0)=0;
		 * n=1,f(1)=1;
		 * n=2,f(2)=1; 
		 * n=3.f(3)=2; 
		 * n=5,f(4)=3; 
		 * f(n)=f(n-1)+f(n-2) ,n>=2 
		 * 1.遞歸的方法實現 設置前兩個返回條件 n==0,return 0; n==1;返回1 
		 * 其時間隨着n呈指數增加 
		 * 
		 * 2.循環實現
		 * 利用for循環來實現,時間複雜度爲O(n)級別
		 */
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		// System.out.println(fibonacci1(n));
		System.out.println(fibonacci2(n));

	}

	public static long fibonacci1(int n) {
		// 遞歸求解
		if (n == 0) {
			return 0;
		}
		if (n == 1) {
			return 1;
		}

		return fibonacci1(n - 1) + fibonacci1(n - 2);
	}

	/**
	 * 上面用遞歸實現的斐波那契數列時間複雜度爲n的指數, 在我們傳入的n爲100時,計算機計算結果都需要等很長一段時間,
	 * 再大時計算機直接崩潰。因此我們可以考慮用循環去代替遞歸。
	 */
	public static long fibonacci2(int n) {
		long numbermin = 0;
		long numbermax = 1;
		long result = 0;
		// 求當n=0;n=1的時候值
		if (n == 0) {
			return 0;
		}
		if (n == 1) {
			return 1;
		}
		// 當n=2的時候使用循環,注意此處條件是從2開始的
		/**
		 * 當前項,等於前面兩項的值相加
		 * 賦值過程規律:
		 * 和=大數+小數;
		 * 小數=大數;
		 * 大數=和;
		 */
		for (int i = 2; i <= n; i++) {

			result = numbermin + numbermax;
			numbermin = numbermax;
			numbermax = result;
		}

		return result;

	}
}

輸入n:6

輸出:8

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章