劍指Offer--【斐波那契數列】--java

題目描述

大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項爲0)。
n<=39
類似題目:
1.我們可以用21的小矩形橫着或者豎着去覆蓋更大的矩形。請問用n個21的小矩形無重疊地覆蓋一個2*n的大矩形,總共有多少種方法?
2.一隻青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法(先後次序不同算不同的結果)。

思路:

斐波那契數列(Fibonacci sequence)的定義:斐波那契數列指的是這樣一個數列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368…,這個數列從第3項開始,每一項都等於前兩項之和。
斐波那契數列又稱黃金分割數列、因數學家列昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖爲例子而引入,故又稱爲“兔子數列”。在數學上,斐波納契數列以如下被以遞歸的方法定義:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)。

代碼:

現在,我們使用Java來打印斐波那契數列的前10個數字:

第一種方式:直接賦值法

public class PrintFib {
 
	public static void main(String[] args) {
		
		//定義第一個加數a,初始值爲1;定義第二個加數b,初始值爲1;定義兩個加數之和爲c,初始值爲0
		int a = 1;
		int b = 1;
		int c = 0;
		//首先在控制檯打印出數列中第一個數和第二個數的值
		System.out.print(a + "\t" + b + "\t");
		//建立一個for循環,用於循環輸出數列中第三位至第十位的數字
		for (int i = 3; i <= 10; i++) {
			//第三個數即爲c,a+b等於c的值
			c = a + b;
			//將第一個加數a賦值爲數列中的第二個數b的值
			a = b;
			//將第二個加數b賦值爲數列中的第三個數c的值
			b = c;
			//在第二次循環打印時,將打印數列中的第四個數爲:b + c = b + (a + b) 
			System.out.print(c + "\t");
		}
	}
}

該方法還可簡化爲:

public class PrintFib {
	
	public static void main(String[] args) {
		
		int a = 1;
		int b = 1;	
		for(int i = 1;i <= 5;i++) {	
			//循環打印a,b兩個數,即兩個兩個打印
			System.out.print(a + "\t" + b + "\t");
			//打印第三、四個數
			a = a + b;
			b = a + b;		
		}
	}
}

第二種方式:建立並打印數組

public class PrintFib {
	
	public static void main(String[] args) {
		
		//建立一個長度爲10的數組用於存放數列中的數
		int[] arr = new int[10];
		//先定義數列中的第一個和第二個數
		arr[0] = 1;
		arr[1] = 1;
		//建立一個for循環,打印數組中的元素
		for(int i = 0;i < arr.length;i++) {
			//判斷:當打印第三個數前,給第三個數賦值
			if(i > 1) {
				arr[i] = arr[i - 2] + arr[i - 1];
			}
			System.out.print(arr[i] + "\t");
		}
		
	}
}

第三種方式:調用函數

public class PrintFib {
	
	//建立一個函數,用於計算數列中的每一項
	public static int fib(int num) {
		//判斷:是否是第一個數和第二個數
		if(num == 1 || num == 2) {
			return 1;
		}else {
			//循環調用本函數
			return fib(num - 2) + fib(num - 1);
		}
	}
	
	//主函數(程序入口)
	public static void main(String[] args) {
		
		//建立一個for循環,用於打印第一個至第十個數字
		for(int i = 1;i <= 10;i++) {
			//調用函數進行打印
			System.out.print(fib(i) + "\t");
		}	
	}	
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章