当前位置: 首页 > 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;
}

相关文章:

  • 【Java高阶面经:微服务篇】6.从机房到线程池:隔离机制如何成为高可用系统的“隐形护盾”?
  • 基于Android的XX校园交流APP
  • CSDN gitcode代码推送
  • Python数据可视化高级实战之一——绘制GE矩阵图
  • C#语法篇 :基类子类转换,成员变化情况
  • Web3 领域中的一些专业术语
  • Circle宣布Circle Payments Network主网上线
  • 云祺容灾备份系统公有云备份与恢复实操-华为云
  • 面向恶劣条件的道路交通目标检测----大创自用(当然你也可以在里面学到很多东西)
  • 代码随想录打卡|Day45 图论(孤岛的总面积 、沉没孤岛、水流问题、建造最大岛屿)
  • Linux问题排查-引起服务器带宽使用率高的内鬼
  • 架构的设计
  • APM32小系统键盘PCB原理图设计详解
  • C语言中的弱符号 __attribute__((weak)) 的使用方法
  • asp.net web form nlog的安装
  • ARM反汇编浅析
  • Webpack 分包策略详解及实现
  • word格式相关问题
  • 网络安全之APP渗透测试总结
  • C#面:Server.UrlEncode、HttpUtility.UrlDecode的区别