实现斐波那契数列的三种方式

首先说说斐波那契数列:
从文字上说,费波那西数列由0和1开始,之后的斐波那契系数就由之前的两数相加,数列形式如下:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584,………………
在数学上,是以递归的方法来定义:
F(0)=0
F(1)=1
F(n)= F(n-1)+ F(n-2)

实现需求:输入序号n返回得到对应斐波那契数
程序实现1——函数迭代

public int fnType1(int n)throws Exception{
  if(n==0){
   return 0;
  }else if(n==1||n==2){
   return 1;
  }else if(n>2){
   int temp=fnType1(n-1)+fnType1(n-2);
   if(temp<0){
    throw new Exception("Invalid value for int type, too large");
   }else{
    return temp;
   }
  }else{
   throw new Exception("IllegalArgument value for n,please enter n>=0 ");
  }
 } 

此种方式缺点:大量迭代不断消耗栈空间(搞web开发调试维护的都应该知道服务器栈资源的可贵,如果大量并发调用迭代导致服务器栈资源迟迟得不到回收,而导致web服务器崩溃),效率底,函数自闭性比较弱(优秀的接口应该对输入输出可能出现的错误信息进行捕捉,并提供清楚明了的处理结果),很容易出现错误,调试困难,实际应用中一般不建议使用这种方式,使用时迭代次数也不能超过3次;
程序实现2——时间换空间

public int fnType2(int n) {
        int result = -1;
        int temp1 = 0;
        int temp2 = 1;
        for (int index = 0; index <= n; index++) {
            if (index == 0) {
                result = temp1;
            } else if (index == 1) {
                result = temp2;
            } else {
                result = temp1 + temp2;
                if (result < 0) {
                    result = -2;
                    break;
                }
                temp1 = temp2;
                temp2 = result;
            }
        }
        return result;
    }

此方法主要使用于:使用场景一:对于对象或变量使用次数比较少,使用一次以后就不会再使用的场景;使用场景二:对于内存资源比较稀缺的实时性要求不是太高的嵌入式系统设计中多会采用此种方式;
程序实现3——空间换取时间

private static List<Integer> fnData = new ArrayList<Integer>();
    private static final int maxSize = 50000;

    private static void setFnData() {
        int result = -1;
        int temp1 = 0;
        int temp2 = 1;
        for (int index = 0; index <= maxSize; index++) {
            if (index == 0) {
                result = temp1;
            } else if (index == 1) {
                result = temp2;
            } else {
                result = temp1 + temp2;
                if (result < 0) {
                    result = -2;
                    break;
                }
                temp1 = temp2;
                temp2 = result;
            }
            fnData.add(result);
        }
    }

    public int getFnData(int n) {
        if (fnData.size() == 0) {
            setFnData();
        }
        if (fnData.size() > n && n >= 0) {
            return fnData.get(n);
        } else {
            return -1;
        }
    }

此方法一般用于:对象或变量在程序运行的整个生命周期都存在或频繁调用的场景,如调用外部WebService接口、抽象持续化层、常用配置文件参数加载等等

对于算法设计,不要盲目遵循概念,概念是死的,人是活的,只用结合具体的应用场景才能设计出优秀的算法和结构。

时间: 2024-12-29 01:27:28

实现斐波那契数列的三种方式的相关文章

斐波那契数列的三种时间复杂度

/*前边两个为一种做法*/ /*后边有另外的做法(差分方程以及利用矩阵去做)*/ //***************************************************//***************************************************//*************************************************** 第一种做法 这是2018王道数据结构考研复习指导的第一章思维拓展的题目. 关于斐波那契数列的简介:

Fibonacci series(斐波纳契数列)的几种常见实现方式

费波那契数列的定义: 费波那契数列(意大利语:Successione di Fibonacci),又译费波拿契数.斐波那契数列.斐波那契数列.黄金分割数列. 在数学上,费波那契数列是以递归的方法来定义: (n≧2) 用文字来说,就是费波那契数列由0和1开始,之后的费波那契系数就由之前的两数相加. 首几个费波那契系数是:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233-- 特别指出:0不是第一项,而是第零项. 下面是费波那契数列的几种常见编程实现:

求解斐波那契数列的第n项

对于Fibonacci数列,1,1,2,3,5,8,12,...求解第n项值,我们通常用的是递归算法,即递推式f(n) = f(n-1)+f(n-2).然而这其实是一种效率极低的算法,当n达到41时,就已经需要1s左右,随着n的增加,时间是指数级增长的. 因为该递归算法有太多的重复计算,如下图所示,所用时间T(n) = T(n-1)+T(n-2)+Θ(1),可以知道T(n)有Ω((3/2)n)的下界,T(n)<O(2^n),可以看到这是指数级的时间复杂度. 具体代码实现如下: Elemtype

计蒜客之斐波那契数列

斐波那契数列是一种非常有意思的数列,由 0 和 1 开始,之后的斐波那契系数就由之前的两数相加.用数学公式定义斐波那契数列则可以看成如下形式: F0=0 F1=1 Fn=Fn-1+Fn-2 我们约定 Fn 表示斐波那契数列的第 n 项,你能知道斐波那契数列中的任何一项吗? 输入包括一行,包括一个数字N(0≤N≤50). 输出包括一行,包括一个数字,为斐波那契数列的第N项的值. 样例输入 7 样例输出 13 C++实现代码如下: #include <iostream> using namespa

求斐波那契数列的相邻两项的比值,精确到小数后三位。

未完成,只能假设知道是9和10代入. 代码如下: package zuoye; import java.math.BigDecimal; /* * 求斐波那契数列的相邻两项的比值,精确到小数后三位. * p1,p2,p3......pi,pj,...求pi/pj * 1 1 2 3 5 8 13 * 5/8,8/13,...收敛 */ public class Test { static double feibo(int x){ if(x==1||x==2) return 1; return f

【c语言】求斐波那契数列的前40个数。特点,第1,2个数为1,从第三个数开始,该数是前面两个数之和

// 求斐波那契数列的前40个数.特点,第1,2个数为1,从第三个数开始,该数是前面两个数之和 #include <stdio.h> int main() { int a = 1; int b = 1; int c,i; printf("%d\t%d\t",a,b); for(i = 3; i <= 40; i++) { c = a + b; printf("%d\t",c); a = b; b = c; } printf("\n&quo

斐波那契数列,1.1.2.3.5.8......,输入一个数字,比如3,显示前面三个数字1,1,2.

斐波那契数列(从第三个数字开始都是前面两个数字的和),1.1.2.3.5.8......,输入一个数字,比如3,显示前面三个数字1,1,2. 1 public class practice { 2 int fib(int n) {//递归 3 if (n <=2) return 1;//数列前两个返回1,无规律可寻. 4 return (fib(n -1) +fib(n - 2));//从第三个开始,则是前面两个数字的和. 5 } 6 public static void main(String

python 题目:斐波那契数列计算;题目:站队顺序输出;题目:合法括号组合的生成;题目:用户登录(三次机会)

斐波那契数列计算 B 描述 斐波那契数列如下: F(0) = 0, F(1) = 1 F(n) = F(n-1) + F(n-2) 编写一个计算斐波那契数列的函数,采用递归方式,输出不超过n的所有斐波那契数列元素 调用上述函数,完成如下功能: 用户输入一个整数n,输出所有不超过n的斐波那契数列元素.输出数列的元素和及平均数,输出按照顺序,用英文逗号和空格分割 此题目为自动评阅,请严格按照要求规范输入和输出. def jebona(n): if n==0: return 0 elif n == 1

MIT Python 第四课函数抽象与递归简介 最后三分钟递归的经典案例:斐波那契数列

斐波那契数列Fibonacci Sequence,又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*) 有一对一个月大的一公一母的兔子,再过一个月的时候交配生小兔子,假设它们生的是两只一公一母的小兔子,在下一个月末这两只小兔子也有了后代同样是一公一母,问题是一年后你会有多少只小兔子?[呲牙]第三年的时候就像到了澳大利亚... >>&g