Java实现斐波那契数高效算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wufaliang003/article/details/82793321

前段时间去面试,被问到了斐波那契数算法,在此回顾总结一下。

1、什么是斐波那契数算法

斐波那契数,亦称之为斐波那契数列(意大利语: Successione di Fibonacci),又称黄金分割数列、费波那西数列、费波拿契数、费氏数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……在数学上,斐波那契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=Fn-1+Fn-2(n>=2,n∈N*),用文字来说,就是斐波那契数列由 0 和 1 开始,之后的斐波那契数列系数就由之前的两数相加。

2、递归调用实现

public class Demo {
	public static void main(String[] args) {
		//输出第n项的值
		Scanner scan = new Scanner(System.in);
		System.out.println("请输入第n项的值:");
		int n = Integer.parseInt(scan.nextLine().trim());
		System.out.println("f("+n+")="+f(n));
		//输出前n项所有数据 每10个换一行
		for(int i=1;i<=n;i++){
			System.out.print(f(i)+"\t");
			if(i%10==0){
				System.out.println();
			}
		}
	}
	/**
	 * 传入参数n  返回值类型为long,若为int可能出现溢出
	 */
	public static long f(int n){
		if(n == 1 || n == 2){//参数1或者2时
			return 1;
		}else{
			return f(n - 1) + f(n - 2);
		}
	}
}

次算法实现了功能,但是在输入的n值特别大的时候性能会有影响。时间复杂度为O(2^n)。

3、利用三个参数a b c---输出第n项的值 以及前n项中每一个数

在递归调用中算n位的时候,需要计算第n-1和n-2位,计算n-1时需要计算n-2和n-3,发现很多都是重复计算。如果直接计算输出则可以提高性能,降低时间复杂度。

public class Demo2 {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		System.out.println("请输入:");
		int n = Integer.parseInt(scan.nextLine().trim());
		//设置a b c 的初始值 在后面的代码中使a b c 的值不断变化 
		long a =1,b = 1,c = 0;
		System.out.print("前"+n+"项为:\n"+a+"\t"+b+"\t");
		for(int i=3;i<=n;i++){//此处要减去两项
			c = a + b;
			a = b;
			b = c;
			System.out.print(c+"\t");
			if(i%10==0){
				System.out.println();
			}
		}
		//输出请第n项的值:
		System.out.println("\n"+"f("+n+")="+c);
	}
}

现在时间复杂度为O(n)

猜你喜欢

转载自blog.csdn.net/wufaliang003/article/details/82793321