菲波那切数列(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

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