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时,程序的运行状况如下:

  1. 首先,在main函数中,程序会等待用户输入一个整数,假设用户输入的是20

  2. 然后程序调用dec2hex函数,并将输入的整数20作为参数传递给dec2hex函数。

  3. dec2hex函数中,首先判断输入的数值20是否大于15。由于20大于15,所以会进行第一次递归调用,即dec2hex(20/16),即dec2hex(1)

  4. 在第一次递归调用中,dec2hex函数会继续判断1是否大于15。由于1不大于15,所以不会进行第二次递归调用。然后,程序会执行下面的代码:

    • 计算1 % 16的结果,即1
    • 由于1小于10,所以输出字符'1'
  5. 第一次递归调用结束,程序返回到之前的递归调用处继续执行未完成的代码。这是因为递归调用是通过函数调用栈来实现的,每次函数调用都会在栈中创建一个新的帧,包含函数的参数、局部变量和返回。
  6. 返回到第一次递归调用,继续执行下面的代码:

    • 计算20 % 16的结果,即4
    • 由于4小于10,所以输出字符'4'
  7. 回到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:

posted @ 2024-03-02 13:39  iZJ"Qq4577105  阅读(8)  评论(0编辑  收藏  举报