斐波那契数的实现与改进

什么是斐波那契数

定义:

斐波那契数为第一个数和第二个数是1,从第三个数开始为前两个数之和,数学表达式为:
当N<3时,f(N) = 1;
当N=>3时,f(N) = f(N-1)+f(N-2);

代码实现:

1、递归实现:

 int Fib(int n)
{
    int First = 1;
    int Second = 1;
    int ret = 0;
    if (n<3)
    {
        return 1;
    }
    else
    {
        return Fib(n - 1) + Fib(n - 2);
    }
}

时间复杂度:O(n)=递归次数(n-1)*基本操作1=n;
空间复杂度:O(n)=递归次数(n-1)*创建对象个数为常数 = n

2、非递归实现:

int Fib(int n)
{
    int First = 1;
    int Second = 1;
    int ret = 0;
    if (n<3)
    {
        return 1;
    }
    while (n > 2)
    {
        ret = First + Second;
        First = Second;
        Second = ret;
        n--;
    }
    return ret;
}

时间复杂度:O(n)=n,运行次数为n次;
空间复杂的;O(n)=O(1),创建对象都为常数项

所存在的缺陷:

当N为一个非常大的数时,那么使用递归调用的时间复杂度是非常大的,执行的效率也是非常的差。

代码改进:

long long Fib(long long first, long long second, long N)
{
    if(N < 3)
    {
        return 1;
    }
    if(3 == N)
    {
        return first+second;
        return Fib(second, first+second, N-1);
    }
}

这里的long long 类型是在当你递归很大值时防止内存不够而溢出,
尾递归就是在递归函数中,递归调用返回的结果被直接返回
递归方式总是以二叉树一样在栈上以指数形式增长,耗费时间大,
尾递归方式以类似于循环方式以线性增长,在尾递归时,调用自身的同时直接计算参数。

总结:

尾递归的本质是:将每次计算的结果缓存起来,传递给下次调用,相当于自动累积,节省了计算时间,并且在有的编译器中通常都会对尾递归进行优化。编译器会发现根本没有必要存储栈信息了,因而会在函数尾直接清空相关的栈。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值