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

函数递归所应满足的条件

1.递归的概念

  递归是学习C语⾔函数绕不开的⼀个话题,那什么是递归呢? 递归其实是⼀种解决问题的⽅法,在C语⾔中,递归就是函数⾃⼰调⽤⾃⼰。

  递归的思想:
  把⼀个⼤型复杂问题层层转化为⼀个与原问题相似,但规模较⼩的⼦问题来求解;直到⼦问题不能再被拆分,递归就结束了。所以递归的思考⽅式就是把⼤事化⼩的过程。 递归中的递就是递推的意思,归就是回归的意思。
  优点是它可以把代码变得更加清晰,具有可读性。
 
  但它也有自己的缺点,我们接下来先谈一下递归的两个限制条件,再来从此引出对递归缺点的讨论。

2.递归的限制条件

  我们先来看一个最简单的递归函数:

#include <stdio.h>
int main()
{printf("hehe\n");main();//main函数中⼜调⽤了main函数return 0; }

  当我们尝试运行的时候,可以发现函数陷入了死循环,出现了栈溢出的报错,即会提示出stack overflow的报警。

  实际上我们在使用函数的时候,都会在栈空间分配一块内存,而如果这个函数没有进行完,那么这块空间就不会得到释放,而这个函数又永远不会跳出递归,所以便不断地在内存占据空间,这种死递归没有限制,会无限循环下去,而栈内存的空间是有限的,最终便出现栈溢出的报警。

  我们现在可以尝试去总结函数递归所应该满足的条件:

递归存在限制条件,当满⾜这个限制条件的时候,递归便不再继续。
每次递归调⽤之后越来越接近这个限制条件。
  上述的函数便是在没有限制中不断死循环,才出现了上述的情况。接下来让我们在实例中体会这两个条件的必要之处吧。

3.实例:利用递归方法求n的阶乘

  计算n的阶乘(不考虑溢出),n的阶乘就是1~n的数字累积相乘。

  我们知道n的阶乘的公式: n=  n ∗ (n − 1)!

  这样的思路就是把⼀个较⼤的问题,转换为⼀个与原问题相似,但规模较⼩的问题来求解的。
  n!---> n*(n-1)!
  (n-1)! ---> (n-1)*(n-2)!
  ....
  直到n是1或者0时,不再拆解。
  再稍微分析⼀下,当 n<=1 的时候,n的阶乘是1,其余n的阶乘都是可以通过上述公式计算。

  那我们就可以写出函数Fact求n的阶乘,假设Fact(n)就是求n的阶乘,那么Fact(n-1)就是求n-1的阶乘,函数如下:

int Fact(int n)
{if(n<=0)return 1;elsereturn n*Fact(n-1);
}
#include <stdio.h>
int Fact(int n)
{if(n<=0)return 1;elsereturn n*Fact(n-1);
}
int main()
{int n = 0;scanf("%d", &n);
int ret = Fact(n);
printf("%d\n", ret);return 0;}

  在这个函数当中,函数在递归的时候不断靠近n=0这一个限制条件,这也完美满足了函数递归的条件。希望大家都能有所收获,喜欢我的话可以点点赞,加个关注,评论一下,谢啦,爱你们。

http://www.lryc.cn/news/247007.html

相关文章:

  • Python入职某新员工大量使用Lambda表达式,却被老员工喷是屎山
  • Android Bitmap保存成至手机图片文件,Kotlin
  • frp V0.52.3 搭建
  • 最近数据分析面试的一点感悟...
  • ZYNQ_project:IIC_EEPROM
  • Leetcode 2940. Find Building Where Alice and Bob Can Meet
  • C++ 泛型编程,函数模版和类模版
  • 【封装UI组件库系列】封装Button图标组件
  • windows系统mobaxterm远程执行linux上ssh命令
  • debian 12 配置
  • AIGC创作系统ChatGPT网站源码、支持最新GPT-4-Turbo模型、GPT-4图片对话能力+搭建部署教程
  • Vue 中简易封装网络请求(Axios),包含请求拦截器和响应拦截器
  • git提交报错error: failed to push some refs to ‘git url‘
  • 【Python】(自定义函数)模块的相对路径导入
  • 巧妙之中见真章:深入解析常用的创建型设计模式
  • Selenium切换窗口、框架和弹出框window、ifame、alert
  • QT linux下应用程序打包
  • Java高级技术(单元测试)
  • leetCode 1080.根到叶路径上的不足节点 + 递归 + 图解
  • C++基础 -10- 类
  • 【软件测试】性能测试相关指标
  • Leetcode 2943. Maximize Area of Square Hole in Grid
  • qt 简单了解QHBoxLayout QVBoxLayout QFormLayout水平,垂直,表单布局管理器.
  • springboot中4级配置文件优先级
  • Python(八十九)函数的参数的内存分析
  • 西南科技大学C++程序设计实验二(类与对象一)
  • 代码随想录二刷 |哈希表 |四数之和
  • KMP算法【数据结构】
  • 测开笔记--Typescript: 文件复制到指定目录
  • 数字滚动vue-count-to