C语言——函数递归与迭代 [复制链接]
发表于 2025-8-11 19:02:48 | 显示全部楼层 |阅读模式
(1)递归的例子:
顺序打印一个整数,打印整数的每一位。
例如:
input:1234
output:1 2 3 4
input:520
output:5 2 0
我们可能会想到用这种方法:(但是运行之后,我们发现效果是事与愿违的)
  1. #include <stdio.h>
  2. int main()
  3. {
  4.         int n = 0;
  5.         scanf_s("%d",&n);
  6.         while (n)
  7.         {
  8.                 printf("%d",n%10);
  9.                 n = n / 10;
  10.         }
  11.         return 0;
  12. }
复制代码

准确的分析思绪是怎样的呢?
例如,我们要打印1234的每一位:
1.先打印出123的每一位(1234/10------>123)
2.打印4(1234%10--------------->4)
以此类推。我们可以了解到,递归是逐渐将原来一个大的问题逐渐细化为一个小问题。
 
对于文章最开始提出的那个问题,如何使用函数递归实现呢?
 
  1. #include <stdio.h>
  2. void Print(int n)
  3. {
  4.         if (n > 9)
  5.         {
  6.                 Print(n/10);
  7.         }
  8.         printf("%d ",n%10);
  9. }
  10. int main()
  11. {
  12.         int n = 0;
  13.         scanf_s("%d",&n);
  14.         Print(n);
  15.         return 0;
  16. }
复制代码

分析:
 
 
从内存的角度上看,是怎么回事呢?
 
函数的每一次调用,都会向栈区申请一块内存空间。这一块空间重要用来存放函数中的局部变量,和函数调用过程的上下文信息。这个空间一样平常叫做,函数的运行时堆栈,也叫函数栈帧空间。编译会主动根据必要开辟空间。
(2)迭代
函数不返回,函数对应的栈帧空间就不绝占用,以是假如函数调用中存在递归调用的话,每一次递归函数调用都会开辟属于本身的栈帧空间。直到函数递归不再继续,开始回归,才逐层释放栈帧空间。
 迭代的本质是做一件重复的事变,例如for循环的过程。
我们来看一个盘算阶乘的例子:
源码:
  1. #include <stdio.h>
  2. //计算一个数字的阶乘
  3. int Fac(int n)
  4. {
  5.         int i = 0;
  6.         int ret = 1;
  7.         for (i = 1;i <= n;i++)
  8.         {
  9.                 ret = ret * i;
  10.         }
  11.         return ret;
  12. }
  13. int main()
  14. {
  15.         int n = 0;
  16.         scanf_s("%d",&n);
  17.         int ret = Fac(n);
  18.         printf("%d\n",ret);
  19.         return 0;
  20. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表