題目描述
大家都知道斐波那契數列,現在要求輸入一個整數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");
}
}
}