你是真的“C”——详解函数递归
创始人
2024-05-03 06:13:40
0

详解函数递归运用😎

  • 前言🙌
    • 一、什么是递归🙌
    • 二、递归运用的两个必要条件🙌
    • 三、递归与迭代🙌
  • 总结撒花💞

哈喽!😄各位CSDN的uu们,我是你的博客好友小梦,希望我的文章可以给您带来一定的帮助,话不多说,文章推上!欢迎大家在评论区唠嗑指正,觉得好的话别忘了一键三连哦!😘

前言🙌

    哈喽各位友友们😊,我今天又学到了很多有趣的知识现在迫不及待的想和大家分享一下!在学习C语言函数时,想必大家对函数递归这个模块的知识点还是感到比较玄妙的,我开始学函数递归的时候给我的感受就是它很奇妙,但是对它如何递?又如何归?的过程不是很了解。经过我这几天的刻苦学习,终于领悟到了它的精髓!本文的知识干货满满,千万不要错过哟!😍😍😍好啦,废话不多说,下面就带着大家学习函数递归的知识。😘

一、什么是递归🙌

什么是递归呢❓简单来说,程序调用自身的编程技巧称为递归(recursion)函数递归这种方法,通常把一个大型复杂的问题层层转化成一个与原问题相似的规模较小的问题来求解的递归策略。只需要少量的代码就可以描述出解题过程中所需要的大量的重复计算,大大减少了程序的代码量。递归的主要思考方式: 把大事化小,函数从哪里调用就返回到哪里

二、递归运用的两个必要条件🙌

1. 存在限制条件,当满足这个限制条件时,递归便不再继续。
2. 每次递归调用之后越来越接近这个限制条件。

   看着文字,大家可能还是感到有些困惑,接下来我举几个例子帮助大家更好的了解函数递归的这两个条件。😊
例一:接受一个整型值(无符号),按照顺序打印它的每一位。
例如:输入1234,输出1 2 3 4
画图分析:😍
在这里插入图片描述
在这里插入图片描述

解题代码: 😍

#define _CRT_SECURE_NO_WARNINGS 1
#include
void print(int n)
{if (n > 10){print(n / 10);}printf("%d ", n % 10);
}
int main()
{int num = 1234;print(num);return 0;
}

运行结果:
在这里插入图片描述

例二:
编写一个函数不允许创建临时变量,求字符串的长度
画图分析:😍
在这里插入图片描述

在这里插入图片描述

解题代码:😍

#define _CRT_SECURE_NO_WARNINGS 1
#include
int  my_strlen(const char*str)
{if (*str == '\0'){return 0;}else{return my_strlen(str + 1) + 1;}
}
int main()
{char arr[] = "abcd";int len = my_strlen(arr);printf("%d", len);return 0;
}

运行结果
在这里插入图片描述
看了上面的代码,比起你写的非递归方式是不是在代码量上有所减少呢😃。哎呀,忙活了一个多小时,终于分析整理出来啦,只要大家能够看懂,理解递归调用的精髓就值啦!
这里小小总结一下吧:首先要知道函数递归的两个必要条件,然后真正了解到核心思想:大事化小,函数从哪里调用就返回到哪里。

三、递归与迭代🙌

虽然递归写出来可以减少代码量,但是它也有缺点。为什么这么说呢?接下来举一个经典的例子,大家就知道啦,废话不多讲,分析如下!🙌
例子:求第n个斐波那切数(不考虑溢出问题)

画图分析: 😍
在这里插入图片描述
解题代码:😍

#define _CRT_SECURE_NO_WARNINGS 1
#include
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 num = fib(n);printf("第%d个斐波那契数为:%d", n, num);return 0;
}

测试代码,看看第10个斐波那契数是否为55:
在这里插入图片描述
这个例子是不考虑溢出的情况,所以只针对例子来说的话是没毛病的,但是实际上它存在溢出的问题。如果利用递归的方法的话,求第50个菲波那切数程序会消耗特别多的时间。我亲测是十分钟左右才跑出来。当求第10000个斐波那契数的时候,程序会崩掉。为什么会这样呢?我发现,在fib函数调用的时候,有很多重复的运算。如下图可知,当求第50个斐波那契数时,关于44这个的展开就已经重复出现很多次了,一直画下去的话,可想而知有多少数字是被重复展开计算的!
画图分析: 😍
在这里插入图片描述
因此,这里用非递归的方式来求解斐波那契数这个问题,效率更好,虽然递归代码看起来很少,但这里内部是进行很多运算的,很多重复的运算在里面,从而使栈溢出
非递归的方法实现: 😍
首选先定义三个变量,当n >= 2的时候,pre与next都是赋值为1,pre+next = resurt当n>2时,

画图分析:

在这里插入图片描述

非递归解题代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include
int fib(int n)
{int pre;int next = 1;int resurt = 1;while (n > 2){n -= 1;pre = next;next = resurt;resurt = pre + next;}return resurt;
}
int main()
{int n = 0;scanf("%d", & n);int c = fib(n);printf("%d", c);
}

总结撒花💞

    许多问题是已递归的形式所解释的,这只是因为它比非递归的形式更为清晰。但是,这些问题的迭代实现往往比递归实现的效率更高,虽然代码的可读性稍微差些。所以对于递归的使用,要看具体问题具体分析,不要死用递归来解题本篇文章旨在带领大家学习函数递归的知识, 如果我写的有什么的不好之处或者不足之处,请在文章下方给出你宝贵的意见😊。如果觉得我写的好的话请点个赞赞和关注哦~😘😘😘

相关内容

热门资讯

安卓系统的手机优缺点,全面解析... 你有没有发现,现在市面上手机种类繁多,让人挑花了眼?其中,安卓系统的手机可是占据了半壁江山呢!今天,...
平板有没有安卓系统,安卓系统引... 你有没有想过,平板电脑到底有没有安卓系统呢?这个问题听起来可能有点奇怪,但确实很多人在选购平板时都会...
安卓手机双系统好用不,安卓手机... 你有没有想过,你的安卓手机是不是也能像多面手一样,既能驾驭工作,又能享受娱乐呢?没错,说的就是那个神...
安卓系统怎么登录国际服,一键操... 你有没有想过,为什么有时候你的安卓手机上会出现那些国际服的游戏呢?是不是好奇怎么登录这些神秘的国外服...
安卓系统的时间天气没了,天气功... 最近你的安卓手机是不是也遇到了一个让人头疼的小问题?那就是——时间天气不见了!没错,就是那个曾经陪伴...
安卓好用的拍照系统,捕捉美好瞬... 你有没有发现,现在手机拍照功能越来越强大了?尤其是安卓手机,拍照系统简直让人爱不释手!今天,就让我带...
软件如何兼容安卓8系统,助您软... 你有没有发现,随着科技的飞速发展,手机软件更新换代的速度也是越来越快呢!这不,安卓8系统已经悄然来临...
安卓通用版系统下载,畅享智能生... 你有没有发现,最近手机界又掀起了一股热潮?没错,就是安卓通用版系统下载!这可是个让无数安卓用户兴奋不...
安卓无线点餐系统ph,PH技术... 你有没有想过,点餐也能变得如此轻松愉快?没错,就是那个我们每天都要面对的吃饭问题,现在有了安卓无线点...
安卓门禁系统怎么样,便捷通行新... 你有没有想过,每天回家时,只需轻轻一刷,门就自动打开了?这就是安卓门禁系统的魅力所在!今天,就让我带...
在电脑上模拟安卓系统,探索虚拟... 你有没有想过,在电脑上也能体验安卓系统的乐趣呢?没错,就是那种随时随地都能玩手机的感觉,现在也能在电...
飞机送餐安卓系统,空中美食新体... 你有没有想过,飞机上的美食是如何送到你手中的?是不是觉得这背后有着神秘的力量?其实,这一切都离不开高...
findx耍原生安卓系统,深度... 亲爱的读者们,你是否厌倦了那些花里胡哨的定制系统,渴望回到那个纯净的安卓世界?今天,我要带你一起探索...
一加系统属于安卓系统吗,引领智... 你有没有想过,手机里的那个神奇的“一加系统”到底是不是安卓系统的一员呢?这可是个让人好奇不已的问题哦...
小米2刷安卓系统吗,探索安卓系... 亲爱的读者,你是否曾经对小米2这款手机刷安卓系统的事情感到好奇呢?今天,就让我带你一探究竟,揭开小米...
安卓7.0系统线刷包,深度解析... 你有没有发现,你的安卓手机最近有点儿“蔫儿”了?别急,别急,今天就来给你揭秘如何让你的安卓手机重焕生...
白菜系统和安卓拍照,开启智能生... 你知道吗?最近我在用手机拍照的时候,发现了一个超级酷的功能,简直让我爱不释手!那就是——白菜系统和安...
安卓系统查杀病毒,全方位守护您... 手机里的安卓系统是不是有时候会突然弹出一个查杀病毒的提示?别慌,这可不是什么大问题,今天就来给你详细...
iso系统与安卓各系统哪个好,... 你有没有想过,手机操作系统就像是我们生活中的不同交通工具,各有各的特色和优势。今天,咱们就来聊聊这个...
中柏怎么换安卓系统,解锁更多可... 你有没有发现,中柏的安卓系统有时候用起来还挺不顺手的?别急,今天就来手把手教你如何给中柏手机升级安卓...