题目:
写一个函数,输入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