C语言函数9--- 递归1
一.引入部分
我们先来看一个题目:
接受一个整型值(无符号),按照顺序打印它的每一位数字,如输入1234,则程序应输出1 2 3 4
示例代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void print(int n){
if (n > 9){
print(n/10);
}
printf("%d ",n);
}
int main(void){
unsigned int num = 0;
printf("请输入:");
scanf("%d", &num);
print(num);
return 0;
}
我们来分析一下这段代码:首先我们看main()函数中的内容,由于题目要求接受值的数据类型为无符号整型,所以我们使用unsigned来对变量修饰,随后初始化变量num(num=0),调用printf()函数提示用户进行输出,再利用scanf()函数获取用户输入的内容并赋值给变量num,随后将num的值传入自定义函数,print()中,我们再来看print()函数中的内容,函数中调用了if语句,当n>9也就是说数字的值是十位数以上的时候则再调用print()函数,将n/10以后的结果传入函数中,这就是递归,接下来我们想一想123传入print()函数,还是满足if语句的入口条件,再次将n/10的结果传入print()函数中,我们接下来用图片的形式来观察程序的执行步骤:
这里我们只看if语句中的内容,先不考虑printf()函数,可以看到当函数递归的时候,原先的1234被除以10后变成123,再将123除以10变成12,最后将12除以10得到1,1<9不满足if语句的入口条件,所以不执行if语句中的内容,我们再来看一下加上printf()语句的结果:
当不满足if语句入口条件后便会执行printf()语句,printf()语句会输出n的结果,这里的n为1,1的结果为1,执行完成后会返回到上一个函数,这时候则会执行上一个函数中的printf()语句,n,此时n=12,12则等于2,所以会输出2,执行完成语句后便再返回到上一个函数中,以此类推,最终就会输出 1 2 3 4,程序运行截图:
我们之前写过一段代码:
#include<stdio.h>
int main(void)
{
main();
return 0;
}
这段代码会导致栈溢出,原因就是递归调用并没有限制,是无条件的递归,所以导致了栈溢出,那么我们上面的程序如果改成一下形式呢?
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<windows.h>
void print(int n){
if (n > 9){
print(n);
}
printf("%d ",n);
}
int main(void){
unsigned int num = 0;
printf("请输入:");
scanf("%d", &num);
print(num);
system("pause");
return 0;
}
我们将if语句中传入print()函数的值不除以10,那会发生什么呢?
这就会导致我们传入的数字一直是1234,一直死循环,最终导致栈溢出,所以递归一定要有条件的限制
2023/8/16
王起舟
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhibbbih
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
微信运动停用后别人还能看到步数吗
PHP中文网 07-22