如果你不经意间看到了这篇博客并且点了进来准备观看的话,那我不得不告诉你:本文无任何干货!
c语言学了这么长时间,断断续续开始涉及算法了。不得不说没有经历过题库的洗礼深入一点直接懵掉了。我脑子笨还是自学只能像一个老哥和我说的那样依靠你现有的一切资源来成长。一个斐波那契数列搞了一晚上最后还是看了相关的题和文章才弄懂的,为了不会在以后忘掉我还是写个给自己看的博客把学到的梳理一项吧(说实话自言自语挺傻的)。
用递归实现的话代码如下(只写自定函数部分):
unsigned int f(int n);
unsigned int f(int n)
{
if (n == 1 || n == 2)
{
return 1;
}
else
{
return f(n - 1) + f(n - 2);
}
}
一个条件判断解决了问题,代码量比起下面要说的迭代方法少了很多,可以说递归算法降低了题目的复杂性,是个很漂亮、很天才的做法,所以说有句话叫“普通程序员用迭代,天才程序员用递归”。但鱼c的小甲鱼老师说了下半句话“但我们宁可做普通程序员”,递归算法同时存在这一些弊端,如不易理解(像我这种脑子不太灵光的这个问题搞了一个晚上),更重要的是,递归降低问题复杂程度的代价是极大的降低了效率,如图:
我的渣机在后面会开始明显卡顿并且运算速度会很慢。
相比之下我们用迭代的方法效率会提高很多,
代码如下:
unsigned long f(int n);
unsigned long f(int n)
{
unsigned long result;
unsigned long a;
unsigned long b;
result = a = 1;
while(n > 2)
{
n -= 1;
b = a;
a = result;
result = a + b;
}
return result;
}
同样是只写了自定义函数的部分,虽然代码量比用递归写的代码多了一些,但是它容易理解(就算是我这种人画了个流程图也就懂了),并且效率提高了很多(大概是…几十万倍?)
同样是求斐波那契数列的前100个,可以说是瞬间得出结果,都来不急调任务管器。
在经历了一晚上的洗礼后,我得到的最终结论就是:“除非遇到一些特殊问题,不然慎用递归”。