版权声明:本文为博主原创文章,未经博主允许不得转载。 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)