斐波那契数列Log(n)算法

本文介绍了一种使用斐波那契数列性质优化求解上台阶问题的算法,通过递归和堆栈操作实现O(log(n))的时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

想法源于题目:一个人一次可以上一个台阶,也可以上两个台阶,问上到20级台阶有多少种走法?

这就是一个斐波那契数列:登上第一级台阶有一种登法;登上两级台阶,有两种登法;登上三级台阶,有三种登法;登上四级台阶,有五种方法……所以,1,2,3,5,8,13……

我们也会发现:

f(3) = f(2) + f(1);

f(4) = 2*(f2)+1*f(1);

f(5) =  3*(f2) + 2*f(1);

f(6) = 5*f(2) + 3*f(1);

..........

f(n) = a*f(x) + b * f(y);

a,b同样是斐波那契数列中的数;同时发现当:

a+x == n &&  b+y ==n-1 && x == y+1时等式成立;

可以得到如下O(log(n))的算法:

        /// <summary>
        
/// 基本原理为:
        
/// n为偶数时f(n)=f(n/2)*f(n/2)+f(n-1)*f(n-1);
        
/// n为基数时f(n)=f(n/2+1)*f(n/2)+f(n/2)*f(n/2-1);
        
/// </summary>
        
/// <param name="n"></param>
        
/// <returns></returns>
        public static long Fn2(int n)
        {
            if (1 < n)
            {
                var steps = new Stack<int>();
                while (n > 2
                {
                    steps.Push(n);
                    n /= 2;
                } 

                long r1 = 2, r2 = 3;
                while (steps.Count > 0
                {
                    int tmp = steps.Pop();
                    if (3 < tmp)
                    {
                        long tr1;
                        long tr2;
                        if (0 == tmp%2)
                        {
                            tr1 = 2*r1*r1 + r2*r2 - 2*r1*r2;
                            tr2 = 2*r1*r2 - r1*r1;
                            r1 = tr1;
                            r2 = tr2;
                        }
                        else
                        {
                            tr1 = 2*r1*r2 - r1*r1;
                            tr2 = r1*r1 + r2*r2;
                            r1 = tr1;
                            r2 = tr2;
                        }
                    }
                    else
                    {
                        r1 = 3;
                        r2 = 5;
                    }

                }
                return r1;
            }
            if (1 == n) return 1;
            return -1;

        }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值