当前位置: 首页 > news >正文

函数递归那些事

什么是递归

递归就是函数自己调用自己,而递归的本质其实是一种解决问题的方法。

递归的思想

递归的思想是把复杂问题大事化小的过程。即把一个大型复杂的问题不断的拆分成与原问题相似,但规模较小的子问题,直到子问题不能被拆分,递归就结束了!

递归的限制条件

其实每一次函数调用,都会在内存的栈区上开辟一块空间,直到调用结束,这块空间才会被回收!函数如果递归层次太深或者无限的递归下去,栈空间被耗干,就会导致栈溢出的问题!

比如调试下面这段代码就会报错

#include <stdio.h>
int i = 0;
int main()
{printf("%d\n", i);i++;main();return 0;
}

通过这段代码,我们可以发现递归的两个条件限制:

1:递归存在结束的条件,当满足这个条件的时候,递归便不再继续

2:每次递归调用之后,都越来越接近这个限制条件

如何使用

比如计算n的阶乘,这个问题就可以用递归来解决,即n的阶乘等于n乘n-1的阶乘

直接上代码

#include <stdio.h>
int fun(int n)//递归
{if (n == 0){return 1;}else{return n * fun1(n - 1);}
}
int main()
{int n = 3;//计算3的阶乘printf("%d! = %d\n", n, fun(n));return 0;
}

其中fun函数就是用来计算n的阶乘的!

该函数的执行逻辑:

1:当n==0的时候,直接返回1,可以看成是让递归结束的条件

2:当n!=0的时候,返回n乘(n-1)的值,每次调用fun函数后参数n都趋向于0

以上面这段代码举例,要计算5的阶乘,先画图

第一次调用fun函数时n==3,执行return n*fun(n-1);语句

而该语句中调用fun函数,计算n-1的阶乘(即2的阶乘)

因为n==2,所以执行return n*fun(n-1);语句

该语句中调用fun函数,计算n-1的阶乘(即1的阶乘)

因为n==1,所以执行return n*fun(n-1);语句

该语句中调用fun函数,计算n-1的阶乘(即0的阶乘)

而n==0,执行return 1;语句

然后将返回值一次带回去,最后计算结果为6

运行结果为:

递归的特点

1:递归是用少量的代码完成了大量复杂的运算

2:由于每次调用都会在内存的栈区上开辟一块空间,所以递归函数在调用的时候涉及一些运行时的开销

递归的使用场景

递归并不一定适合所有的问题,一般情况下,使用迭代(循环)的方法来解决问题的效率要更高,而只有当一个问题非常复杂,难以用迭代的方法来处理时,使用递归实现的简洁性便可以弥补它所带来的运行时开销

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • MySQL基础练习题47-判断三角形
  • haproxy实验-2
  • Asciidoc 转化为 CSDN 帖子,完美数学公式
  • Ubuntu20.04 运行深蓝路径规划hw1
  • 微软披露Office最新零日漏洞,可能导致数据泄露
  • C语言相关
  • python从入门到精通:基础语法讲解
  • C++:std::pair的定义及用法
  • Python基础知识学习总结(一)
  • 设计模式---简单工厂模式
  • Bazaar v1.4.3 任意文件读取漏洞复现(CVE-2024-40348)
  • 【C++ 面试 - 基础题】每日 3 题(十五)
  • PostgreSQL-02-入门篇-查询数据
  • 《全面解析 Nginx:从下载安装到高级应用与问题解决》
  • Linux 操作系统 --- 信号
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • Hexo+码云+git快速搭建免费的静态Blog
  • js作用域和this的理解
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • passportjs 源码分析
  • PAT A1120
  • React Native移动开发实战-3-实现页面间的数据传递
  • sessionStorage和localStorage
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • TypeScript实现数据结构(一)栈,队列,链表
  • vue总结
  • 笨办法学C 练习34:动态数组
  • 读懂package.json -- 依赖管理
  • 给第三方使用接口的 URL 签名实现
  • 面试遇到的一些题
  • 判断客户端类型,Android,iOS,PC
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 算法-插入排序
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • 移动端高清、多屏适配方案
  • ​批处理文件中的errorlevel用法
  • ​数据结构之初始二叉树(3)
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (27)4.8 习题课
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (LeetCode C++)盛最多水的容器
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (vue)页面文件上传获取:action地址
  • (八)Flask之app.route装饰器函数的参数
  • (层次遍历)104. 二叉树的最大深度
  • (动态规划)5. 最长回文子串 java解决
  • (多级缓存)缓存同步
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (七)c52学习之旅-中断
  • (四)React组件、useState、组件样式
  • (文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (原创)可支持最大高度的NestedScrollView