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

C语言——函数递归与迭代

(1)递归的例子:

顺序打印一个整数,打印整数的每一位。

例如:

input:1234

output:1 2 3 4

input:520

output:5 2 0

我们可能会想到用这种方法:(但是运行之后,我们发现结果是事与愿违的)

#include <stdio.h>int main()
{int n = 0;scanf_s("%d",&n);while (n){printf("%d",n%10);n = n / 10;}return 0;
}

正确的分析思路是怎样的呢?

例如,我们要打印1234的每一位:

1.先打印出123的每一位(1234/10------>123)

2.打印4(1234%10--------------->4)

以此类推。我们可以了解到,递归是逐渐将原来一个大的问题逐渐细化为一个小问题。

 

对于文章最开始提出的那个问题,如何使用函数递归实现呢?

 

#include <stdio.h>void Print(int n)
{if (n > 9){Print(n/10);}printf("%d ",n%10);
}int main()
{int n = 0;scanf_s("%d",&n);Print(n);return 0;
}

分析:

 

 

从内存的角度上看,是怎么回事呢?

 

函数的每一次调用,都会向栈区申请一块内存空间。这一块空间主要用来存放函数中的局部变量,和函数调用过程的上下文信息。这个空间一般叫做,函数的运行时堆栈,也叫函数栈帧空间。编译会自动根据需要开辟空间。

(2)迭代

函数不返回,函数对应的栈帧空间就一直占用,所以如果函数调用中存在递归调用的话,每一次递归函数调用都会开辟属于自己的栈帧空间。直到函数递归不再继续,开始回归,才逐层释放栈帧空间。

 迭代的本质是做一件重复的事情,例如for循环的过程。

我们来看一个计算阶乘的例子:

源码:

#include <stdio.h>//计算一个数字的阶乘
int Fac(int n)
{int i = 0;int ret = 1;for (i = 1;i <= n;i++){ret = ret * i;}return ret;
}int main()
{int n = 0;scanf_s("%d",&n);int ret = Fac(n);printf("%d\n",ret);return 0;
}

http://www.xdnf.cn/news/566911.html

相关文章:

  • 微调后的模型保存与加载
  • Android13 wifi设置国家码详解
  • 结课作业01. 用户空间 MPU6050 体感鼠标驱动程序
  • SuperVINS:应对挑战性成像条件的实时视觉-惯性SLAM框架【全流程配置与测试!!!】【2025最新版!!!!】
  • flink 提交流程
  • 基于Flink的数据中台管理平台
  • CNN手写数字识别/全套源码+注释可直接运行
  • 基于moonshot模型的Dify大语言模型应用开发核心场景
  • 如何成为更好的自己?
  • AI智能分析网关V4玩手机检测算法精准管控人员手机行为,搭建智慧化安防监管体系
  • iOS 15.4.1 TrollStore(巨魔商店)安装教程详解:第二篇
  • Ubuntu学习记录
  • vscode打开vue + element项目
  • ADB常用语句
  • springboot 1.x2.x依赖spring版本
  • 初识Linux · 五种IO模型和非阻塞IO
  • Flink基本理解
  • 初识Linux · NAT 内网穿透 内网打洞 代理
  • 【题解-洛谷】B4240 [海淀区小学组 2025] 最短字符串
  • buunctf Crypto-[NCTF2019]Keyboard1
  • 腾讯游戏安全与高通合作构建PC端游安全新格局
  • 改写视频生产流程!快手SketchVideo开源:通过线稿精准控制动态分镜的AI视频生成方案
  • Java开发-如何将一个字符串转换成一个数组,又如何把他转换成一个集合
  • Linux中I/O复用机制epoll
  • 【Netty】- 入门2
  • dify基于文本模型实现微调Fine-tune语料构造工作流
  • 在 Ubuntu 下通过 C APP程序实现串口发送数据并接收返回数据
  • OSCP备战-Stapler靶场详细步骤
  • 用java实现内网通讯,可多开客户端链接同一个服务器
  • 离线服务器算法部署环境配置