C语言递归调用子函数
示例代码1:10进制转16进制
查看代码
#include<stdio.h>
void dec2hex(int n)
{
if(n>15)
dec2hex(n/16);
if(n%16 < 10)
printf("%c",n%16+'0');
else
printf("%c", n%16+55);
//printf("%c",n%16<10 ? n%16+'0' : n%16+55); //小于16的数,那么就将其取模% 然后加上'0'
}
//
int main()
{
int n;
scanf("%d",&n);
dec2hex(n);
return 0;
}
当输入20时,程序的运行状况如下:
-
首先,在
main
函数中,程序会等待用户输入一个整数,假设用户输入的是20
。 -
然后程序调用
dec2hex
函数,并将输入的整数20
作为参数传递给dec2hex
函数。 -
在
dec2hex
函数中,首先判断输入的数值20
是否大于15。由于20
大于15,所以会进行第一次递归调用,即dec2hex(20/16)
,即dec2hex(1)
。 -
在第一次递归调用中,
dec2hex
函数会继续判断1
是否大于15。由于1
不大于15,所以不会进行第二次递归调用。然后,程序会执行下面的代码:- 计算
1 % 16
的结果,即1
。 - 由于
1
小于10,所以输出字符'1'
。
- 计算
- 第一次递归调用结束,程序返回到之前的递归调用处继续执行未完成的代码。这是因为递归调用是通过函数调用栈来实现的,每次函数调用都会在栈中创建一个新的帧,包含函数的参数、局部变量和返回。
-
返回到第一次递归调用,继续执行下面的代码:
- 计算
20 % 16
的结果,即4
。 - 由于
4
小于10,所以输出字符'4'
。
- 计算
-
回到
main
函数,dec2hex
函数执行完毕,程序结束并返回0。
因此,当输入20时,最终输出结果是 14
示例代码2:阶乘
查看代码
#include <stdio.h>
int n,y;
int f;
int fac(int n)
{
if(n<0)
printf("n<0,data error!");
else if(n==0||n==1)
f=1;
else
f=fac(n-1)*n;
return(f);
}
int main()
{
printf( "input an integer number:");
scanf("%d",&n);
y=fac(n);
printf("%d!=%d\n",n,y);
return 0;
}
当输入3时,输出6:
程序是这样fac(2)*3,然后fac(1)*2,然后计算可知fac(1)为1,。此时就倒起回去,挨个计算,最终等于6
当输入5时,输出20:
作者QQ4577105