題目:
寫一個函數,輸入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