递归
人们常说:“@不准备秃的大伟乃人中赤兔,马中吕布啊!”
诶,那我这个赤兔(吃土) 今天就要来谈一谈C语言中的赤兔,吕布:递归!!!!!!
相信很多小伙伴都听说过递归吧,没错,就是那个自己调用自己的“到底是谁杀了我,我又杀了谁,哦!原来是我杀了我自己!” 的递归
仍记得当初我写递归的时候,写出了 “烫烫烫” ,那时候递归就和我语重心长的说:“不要迷恋哥,哥只是个传说”,没错,递归用得好,就是锦上添花,用得不好,就是自己给自己埋雷!
#include <stdio.h>
int main()
{
printf("hehe\n");
main();//main函数中⼜调⽤了main函数
return 0;
}
上面就是一段递归的代码,虽然没有什么实际的意义,但是可以hin好的解释递归的使用规则。
那博主接下来给大家看个例子,大家自行评断这个递归用的好不好:
#include <stdio.h>
int Fib(int n)
{
if(n<=2)
return 1;
else
return Fib(n-1)+Fib(n-2);
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = Fib(n);
printf("%d\n", ret);
return 0;
}
都能认出来这是斐波拉切数列把?这时候就有人说了:“诶,大伟啊,这不写的挺好的嘛?前几项不都可以轻松算出来?你是不是脑子秀逗了啊”。
(¬◡¬)✧
是啊,前几项是可以轻松算出来啊,但你想过如果数字hin大的时候呢?
这两个图对比发现当我们在vs2022上测试n = 50的时候会发现vs在电脑上占用的CPU比平常多太多了,而且博主也是等了好久才等到个答案。那这是为什么呢?一个图解决你的疑问 ƪ(˘⌣˘)ʃ
我们可以继续推算下去,会发现就算是求50的斐波拉切数列也会要hin~~多计算过程 ,这也就说明这个递归的写法是非常低的。那我们该怎么写的呢?其实很平常的写就可以了:
#include<stdio.h>
int Fib(int n)
{
int a = 1;
int b = 1;
int c = 1;
while(n>2)
{
c = a+b;
a = b;
b = c;
n--;
}
return c;
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = Fib(n);
printf("%d\n", ret);
return 0;
}
这样的话就会快很多了!
所以在我们写代码的时候不要一心向着递归的方向想,虽然有时会很简便,但有时也并非如此哦!
让你爽的东西也会让你痛苦。 ------不准备秃的大伟
讲到这里铁汁们都懂了吗?(¬◡¬)✧
清谈可以饱,梦想接无由。——韩愈
本篇博客也就到此为止了,送大家一碗鸡汤,勉励自己以及这世界上所有追逐梦想的赤子趁年华尚好努力提升自己,莫欺少年穷!