不一样的斐波那契

斐波那契数列:1,1,2,3,5,8,13,21,34,55……
写一个函数,输入n,求斐波那契数列的第n项。
f(n) = 0;n=0
f(n) = 1;n=1
f(n) = f(n-1)+f(n-2);n>1
解法1:递归

long long Fibonacci(unsigned int n)
{
    if(n <= 0)
    {
        return 0;
    }
    if(n == 1)
    {
        return 1;
    }
    return Fibonacci(n - 1) + Fibonacci(n - 2);
}

这是最基本的解法,但是当输入的n值较大时,许多值是重复计算的,(比如输入n值为10,那么接下来计算9和8的值,计算9的值时计算8和7的值,计算8的值时应先计算7和6的值……以此类推)所以其时间复杂度是以n的指数的方式递增的。
解法2:循环

long long Fibonacci(unsigned int n)
{
    int result[2] = {0,1};
    if(n < 2)
    {
        return result[n];
    }
    long long fibonacciOne = 1;
    long long fibonacciTwo = 0;
    long long fibN = 0;
    for(unsigned int i = 2;i<=n;i++)
    {
        fibN = fibonacciOne + fibonacciTwo;
        fibonacciTwo = fibonacciOne;
        fibonacciOne = fibN;
    }
    return fibN;
}

这是最实用的解法,从下往上依次计算。
我们可以实验一下,在分别调用这两个函数前调用GetTickCount()函数获取开始时间,调用返回后再次获取时间。
当输入25以下的数时,两个函数效率基本相同,但是当输入25以上的数时第二个函数的效率显然比第一个函数的效率高。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值