首先介绍斐波那契数列,斐波那契数列的排列是: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很麻烦,偶然试着将先前生成的图形窗口关闭后再次运行即恢复正常。
递归与非递归算法比较: