斐波那契数列

题目要求为求输入整数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;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值