/// <summary>
        /// Use recursive method to implement Fibonacci
        /// </summary>
        /// <param name="n"></param>
        /// <returns></returns>
        static int Fn(int n)
        {
            if (n <= 0)
            {
                throw new ArgumentOutOfRangeException();
            }             if (n == 1||n==2)
            {
                return 1;
            }
            return checked(Fn(n - 1) + Fn(n - 2)); // when n>46 memory will  overflow
        }

递归算法时间复杂度是O(n2), 空间复杂度也很高的。当然不是最优的。

自然我们想到了非递归算法了。

一般的实现如下:


        /// <summary>
        /// Use three variables to implement Fibonacci
        /// </summary>
        /// <param name="n"></param>
        /// <returns></returns>
        static int Fn1(int n)
        {
            if (n <= 0)
            {
                throw new ArgumentOutOfRangeException();
            }             int a = 1;
            int b = 1;
            int c = 1;             for (int i = 3; i <= n; i++)
            {
                c = checked(a + b); // when n>46 memory will overflow
                a = b;
                b = c;
            }
            return c;
        }

这里算法复杂度为之前的1/n了,比较不错哦。但是还有可以改进的地方,我们可以用两个局部变量来完成,看下吧:


        /// <summary>
        /// Use less variables to implement Fibonacci
        /// </summary>
        /// <param name="n"></param>
        /// <returns></returns>
        static int Fn2(int n)
        {
            if (n <= 0)
            {
                throw new ArgumentOutOfRangeException();
            }             int a = 1;
            int b = 1;             for (int i = 3; i <= n; i++)
            {
                b = checked(a + b); // when n>46 memory will  overflow
                a = b - a;
            }
            return b;
        }

好了,这里应该是最优的方法了。

值得注意的是,我们要考虑内存泄漏问题,因为我们用int类型来保存Fibonacci的结果,所以n不能大于46(32位操作系统)

C#完美实现斐波那契数列的更多相关文章

  1. P3986 斐波那契数列

    题目描述 定义一个数列: f(0)=a,f(1)=b,f(n)=f(n−1)+f(n−2) 其中 a,b均为正整数,n≥2 . 问有多少种 (a,b),使得 k 出现在这个数列里,且不是前两项. 由于 ...

  2. C#求斐波那契数列第30项的值(递归和非递归)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  3. 斐波拉契数列加强版——时间复杂度O(1),空间复杂度O(1)

    对于斐波拉契经典问题,我们都非常熟悉,通过递推公式F(n) = F(n - ) + F(n - ),我们可以在线性时间内求出第n项F(n),现在考虑斐波拉契的加强版,我们要求的项数n的范围为int范围 ...

  4. js中的斐波那契数列法

    //斐波那契数列:1,2,3,5,8,13…… //从第3个起的第n个等于前两个之和 //解法1: var n1 = 1,n2 = 2; for(var i=3;i<101;i++){ var ...

  5. 剑指Offer面试题:8.斐波那契数列

    一.题目:斐波那契数列 题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项.斐波那契数列的定义如下: 二.效率很低的解法 很多C/C++/C#/Java语言教科书在讲述递归函数的时 ...

  6. 算法: 斐波那契数列C/C++实现

    斐波那契数列: 1,1,2,3,5,8,13,21,34,....     //求斐波那契数列第n项的值 //1,1,2,3,5,8,13,21,34... //1.递归: //缺点:当n过大时,递归 ...

  7. 洛谷P1962 斐波那契数列 || P1349 广义斐波那契数列[矩阵乘法]

    P1962 斐波那契数列 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数 ...

  8. Python递归及斐波那契数列

    递归函数 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数.举个例子,我们来计算阶乘 n! = 1 * 2 * 3 * ... * n,用函数 fact(n)表示,可 ...

  9. 简单Java算法程序实现!斐波那契数列函数~

    java编程基础--斐波那契数列 问题描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 思路:可能出现的情况:(1) n=1 ,一种方法 ;(2)n=2 ...

随机推荐

  1. 在AD转换中的过采样和噪声形成

    1. 直接量化的过采样AD转换 此类系统的模型可以用下图表示. 图中xa(t)是输入信号,e(t)是量化引入的噪声,xd[n]是最终得到的数字信号,包含分量xda和xde. 对于M倍过采样,信号与量化 ...

  2. json格式的数组长度

    var data = [{"id":"1","name":"a"},{"id":"2&qu ...

  3. 配置 Gii 允许访问的 IP 地址

    通过本机以外的机器访问 Gii,请求会被出于安全原因拒绝,在 config/web.php 配置 Gii 为其添加允许访问的 IP 地址: if (YII_ENV_DEV) { // configur ...

  4. 纸上谈兵:AVL树

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 二叉搜索树的深度与搜索效率 我们在树, 二叉树, 二叉搜索树中提到,一个有n个节点 ...

  5. java se the operation is not applicable to the current selection

    当新建某的类时,需要自动构建 set get方法时. 我们一般 会直接让Myeclipse自动生动.偶尔 .他会犯2. the operation is not applicable to the c ...

  6. boost compile

    pushd E:\boost\boost_1_59_0 b2 stage --toolset=msvc-12.0 --without-python --stagedir="E:\boost\ ...

  7. PHP时间日期

    PHP常用的几个时间日期函数有:date(),mktime(),strtotime(); 一.string date ( string $format [, int $timestamp ] ) 函数 ...

  8. PHP&MySQL 语法

    PHP操作MySQL数据库 第一步:连接数据库 $dbhost = 'localhost:3306'; //mysql服务器主机地址 $dbuser = 'guest'; //mysql用户名 $db ...

  9. delphi XE Berlin ReadProcessMemory WriteProcessMemory

    delphi  XE,Berlin [dcc32 Error] Unit9.pas(93): E2033 Types of actual and formal var parameters must ...

  10. java8中hashMap

    摘自:http://www.importnew.com/20386.html 简介 Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMa ...