求第n个斐波拉契数

首先介绍斐波那契数列,斐波那契数列的排列是:1,1,2,3,5,8,13,21,34,55,89,144……

依次类推下去,你会发现,它后一个数等于前面两个数的和。在这个数列中的数字,就被称为斐波那契数。
如果要找出其中任意一个数,可以用下面两种算法解决 ;
用递归法

#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>

int fib(int x)
{

    if (x <= 2)
        return 1;
    else

        return  fib(x - 1) + fib(x - 2);


}
int main()
{
    int n = 0;
    printf("please a number:>", n);
    scanf("%d", &n);
    int ret = fib(n);
    printf("ret=%d", ret);
    system("pause");
    return 0;
}

非递归(迭代)

#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include <Windows.h>
int Fib2(int n)
{
    int nv = 1;
    int nprev=1;/*nprev=n-1*/
    int npprev = 1;/*npprev=n-2*/
    while (n > 2)/*求斐波拉切值*/
    {
        nv = nprev + npprev;
        npprev = nprev;
        nprev = nv;
        n--;



    }
    return nv;



}
int main()
{


    printf("%d", Fib2(7));

    system("pause");
    return 0;
}

这里写图片描述

总结

1.递归法。算法代码量小,程序简洁。但是递归需要由于不断调用函数自身,因此需要不断的创建栈帧,如果是n的值比较小,还可以,一旦n的数值较大,就会耗费大量时间,同时很容易造成栈溢出,时间,空间都很高。其次,如果算法逻辑不清晰,递归函数很难写,初学者建议少用。如果个人习惯偏爱递归,建议使用static对象替代nonstatic局部对象,不仅可以减少每次递归调用和返回时产生和释放ninstatic对象的开放,而且static还可以保存递归调用的中间状态,并用可为各个调用层所访问。减少bug的出现机率。
2. 迭代法。代码好写,由于是用循环解决问题,不需要频繁调用函数,所以时间,空间成本相比递归要轻松很多。基本只要递归可以解决的问题,迭代都可以解决,(当然排除特殊情况,如汉罗塔的程序编写)。一般情况,首选迭代。
3. vs2013编译错误:

首次运行没有错误,再次运行且没有修改代码时出现下列错误
错误提示:
LINK : fatal error LNK1168: cannot open C:\Users\Administrator\Documents\Visual Studio 2013\Projects\OpenCv3\C7_OpenCV\Debug\C7_OpenCV.exe for writing
解决方法:意思不能打开xxx.exe文件用于改写,说明xxx.exe文件正在运行,所以只要关闭第一次运行时生成的图形窗口即可,这个问题我遇到过多次,每次都是重启VS2013很麻烦,偶然试着将先前生成的图形窗口关闭后再次运行即恢复正常。

递归与非递归算法比较:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值