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

【C语言】09.函数递归

递归其实是⼀种解决问题的方法,在C语言中,递归就是函数自己调用自己。

一、递归的介绍

1.1递归的思想

把⼀个大型复杂问题层层转化为⼀个与原问题相似,但规模较小的子问题来求解;直到子问题不能再被拆分,递归就结束了。所以递归的思考方式就是把大事化小的过程。递归中的递就是递推的意思,归就是回归的意思。

1.2 递归的限制条件

递归在书写的时候,有2个必要条件:
• 递归存在限制条件,当满足这个限制条件的时候,递归便不再继续。
• 每次递归调用之后越来越接近这个限制条件。

二、递归的例子

2.1求解n的阶乘

⼀个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作 n!。

通过分析可以发现n的阶乘公式:n! = n ∗ (n − 1)!
在这里插入图片描述
实现如下:

int Fact(int n)
{if(n == 0)return 1;elsereturn n * Fact (n - 1);
}

##
这里的n不宜过大,否则会造成栈溢出。

2.2 顺序打印数字的每一位

输⼊⼀个整数m,打印这个按照顺序打印整数的每⼀位。
比如:
输⼊:1234 输出:1 2 3 4
输⼊:520 输出:5 2 0

如果n是⼀位数,n的每⼀位就是自己;n是超过1位数的话,就得拆分每⼀位。
实现如下:

void Print(int n)
{if(n>9){Print(n/10);}printf("%d ", n%10);
}

在这里插入图片描述

2.3斐波那契数列

在这里插入图片描述
代码实现:

int Fib(int n)
{if(n<=2)return 1;elsereturn Fib(n-1)+Fib(n-2);
}

在这里插入图片描述

三、迭代与递归

在C语言中每⼀次函数调,都要需要为本次函数调用在栈区申请⼀块内存空间来保存函数调用期间的各种局部变量的值,这块空间被称为运行时堆栈,或者函数栈帧
函数不返回,函数对应的栈帧空间就⼀直占用,所以如果函数调用中存在递归调用的话,每⼀次递归函数调用都会开辟属于自己的栈帧空间,直到函数递归不再继续,开始回归,才逐层释放栈帧空间。所以如果采用函数递归的方式完成代码,递归层次太深,就会浪费太多的栈帧空间,也可能引起栈溢出(stack overflow)的问题。
这一部分的具体内容会在下一篇博客中讲述。

上述分析表明在一般情况下迭代效率远高于递归。

例如上面的2.3,输入50这样的数字时,需要很长时间才能拿到我们想要的结果,因此优化了该代码:

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;
}
http://www.lryc.cn/news/369561.html

相关文章:

  • php高级之框架源码、宏扩展原理与开发
  • (2024,示例记忆,模型记忆,遗忘,差分评估,概率评估)深度学习中的记忆:综述
  • 硬件产品经理
  • AES加密、解密工具类
  • 普通人想要自学ai,该如何入手,看完这篇你就懂了,零基础教程!
  • Less的简单总结
  • Android:UI:Drawable:View/ImageView与Drawable
  • 网络安全实验BUAA-全套实验报告打包
  • 监控易监测对象及指标之:全面监控SQL Server 2008
  • 【学习记录】6.11 阅读记录
  • 100TOPS算力!16GB内存顶配NVIDIA Jetson Orin NX 16GB 开箱
  • OCP学习笔记-007 SQL语言之一:DQL
  • Git之解决重复输入用户名和密码(三十九)
  • Python 机器学习 基础 之 【实战案例】轮船人员获救预测实战
  • 安全相关的一些基础知识(持续更新)
  • 使用TensorFlow和Keras对以ResNet50模型进行微调
  • Shell脚本要点和难点以及具体应用和优缺点介绍
  • 移动端浏览器的扫描二维码实现(vue-qrcode-reader与jsQR方式)
  • android中调用onnxruntime框架
  • 【机器学习】与【数据挖掘】技术下【C++】驱动的【嵌入式】智能系统优化
  • Apollo9.0 PNC源码学习之Control模块(二)
  • 直线度测量仪发展历程!
  • 09-spring的bean创建流程(一)
  • spring中基于setting和构造器的注入方式
  • 爬虫基本原理?介绍|实现|问题解决
  • DevOps的原理及应用详解(六)
  • 手撸 串口交互命令行 及 AT应用层协议解析框架
  • Redis几种部署模式介绍
  • 【STM32HAL库学习】定时器功能、时钟以及各种模式理解
  • 3588麒麟系统硬解码实战