模块化程序设计之函数的递归调用

版权声明:转载请注明 https://blog.csdn.net/qq_34720818/article/details/86672046

模块化程序设计之函数的递归调用

前言
C语言是结构化、模块化的编程语言,可以蒋一个大程序分割成若干相对独立的功能模块,每个模块使用函数来实现,并通过函数调用以及数据传递来实现整体大程序的功能。
1、函数的递归调用
函数的递归调用,即函数直接或者间接调用自身。递归函数用于解决将大规模问题逐渐缩小为小规模问题。
例如将1,2,3,4,5,6倒序,只需要先考虑将两端的两个数字倒序,之后再将2,3,4,5这一块倒序,如此就可以通过递归缩小规模;
递归调用的几个说明:
a、递归函数设计必须有递归调用的形式,即要有自身调用。
b、递归函数必须要有终止递归的条件,否则会导致死循环。
c、递归调用解决问题的程序比较简单、容易编写、容易理解。
d、递归算法优点是算法简洁;缺点是效率不高,占用栈容量大,不适应深度递归
示例代码
1、利用递归思想实现n!

int main()
{
//递归求3!  
    int jiecheng(int n); //函数声明
    printf("请输入n的值\n");
	int n;
	scanf("%d",&n);
	printf("%d的阶乘为%d\n",n,jiecheng(n));
	return 1;
}
int jiecheng(int n)
{
	if(n==0||n==1)
	{
		return 1;
	}
	return n*jiecheng(n-1);
}

注意: 递归函数内的递归,都是在一个函数内部的调用,实质上是一个函数调用一个函数,只不过调用的函数是同一个函数罢了。可以想象成不同函数之间的函数嵌套调用。那么递归条件满足终止时,则会依次递回继续依次执行递归函数下面的代码。
如上面3!的数学逻辑如下:
jiecheng(3)=3 乘 jiecheng(2);
jiecheng(2)=2 乘 jiecheng(1);
jiecheng(1)=1;终止
递归代码执行过程如下:
1、jiecheng(3)函数调用jiecheng(2)函数,jiecheng(2)函数调用jiecheng(1)函数,jiecheng(1)函数返回1,递归终止。
2、依次递回,jiecheng(1)=1–>jiecheng(2)=2乘1–>jiecheng(3)=3乘2乘1=6;

在这里插入图片描述
2、利用递归实现1,2,3,4,5,6数字倒序排列

int main()
{
//1,2,3,4,5,6倒序
    void reverse(int data[],int len);
	int data[]={1,2,3,4,5,6};
	printf("1,2,3,4,5,6\n");
    reverse(data,6);
	printf("\n");

	return 1;
}

void reverse(int data[],int len)
{
	if(len<0)
	{
		return;
	}
	reverse(data+1,len-2);
	int temp;
	temp=data[0];
	data[0]=data[len-1];
	data[len-1]=temp;
	for(int i=0;i<len;i++)
	{
		printf("%d\t",data[i]);
	}
	printf("\t递回\n");
}

1、数学逻辑如下:
daoxu1=6,[daoxu2],1;
daoxu2=5,[daoxu3],2;
daoxu3=4,3;终止
2、递归代码执行过程如下:
daoxu3=4,3–>daoxu2=5,4,3,2–>daoxu1=6,5,4,3,2,1
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_34720818/article/details/86672046
今日推荐