斐波那契数列

题目要求为求输入整数n,返回斐波那契数列的第n个数;

斐波那契数列:0 1 1 2 3 5 8 13 21 34.。。。

即第一项为0,第二项为1,以后每项为钱两项之和

    public int Fibonacci(int n)
    {
        if (n <= 0) return -1;
        if (n == 1) return 0;
        if (n == 2) return 1;
        int[] nums = new int[n];
        nums[0] = 0;
        nums[1] = 1;
        for (int i = 2; i < n; i++)
        {
            nums[i] = nums[i - 1] + nums[i - 2];
        }
        return nums[n - 1];
    }

之后又看了官方的答案,瞬间感觉自己好low。。。

下面是官方给出的代码

    public int Fibonacci(int n)
    {
        if (n <= 0) return -1;
        int a = 0;
        int b = 1;
        for (int i = 0; i < n - 1; i++)
        {
            int c = a + b;
            a = b;
            b = c;
        }
        return a;
    }

2018.5.4补充

今天又遇到求斐波那契数列的算法题,是利用矩阵求解,题目如下:

An alternative formula for the Fibonacci sequence is:


利用题目给的公式求解斐波那契数列的第n项

先定义2X2矩阵及矩阵乘法,和矩阵幂运算(利用二分法求幂运算,这也是自己没想到的,如果是我首先想到的应该是循环求幂,)

 public class Matrix
    {
        public long a, b, c, d;

        public Matrix(long a, long b, long c, long d)
        {
            this.a = a;
            this.b = b;
            this.c = c;
            this.d = d;
        }
        public Matrix() { }

        public static Matrix MatrixMul(Matrix A, Matrix B)
        {
            Matrix m = new Matrix
            {
                a = A.a * B.a + A.b * B.c,
                b = A.a * B.b + A.b * B.d,
                c = A.c * B.a + A.d * B.c,
                d = A.c * B.b + A.d * B.d
            };
            return m;
        }


        //二分法求矩阵幂
        public static Matrix MatrixPow(int n)
        {
            Matrix m = new Matrix();
            if (n == 1)
            {
                m = new Matrix(1, 1, 1, 0);
            }
            else if (n % 2 == 0)
            {
                m = MatrixPow(n / 2);
                m = MatrixMul(m, m);
            }
            else if (n % 2 == 1)
            {
                m = MatrixPow((n - 1) / 2);
                m = MatrixMul(m, m);
                m = MatrixMul(m, new Matrix(1, 1, 1, 0));
            }
            return m;
        }
    }
再实现求解斐波那契数列第n项:
    public string Fibonacci(int n)
    {
        if (n == 0) return "0";
        if (n == 1) return "1";
        Matrix m = Matrix.MatrixPow(n);
        string s = m.b.ToString();
        return s;
    }

阅读更多
个人分类: LintCode算法
上一篇进制转换(Hex Conversion)
下一篇链表元素删除
想对作者说点什么? 我来说一句

斐波那契数列(c#.net源码).rar

2010年06月21日 15KB 下载

没有更多推荐了,返回首页

关闭
关闭