资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

初识C语言:函数详解(二)-创新互联

函数还有很重要的一个板块没有和友友们介绍,这个知识点就是递归。希望我的文章可以带来帮助。

创新互联公司-专业网站定制、快速模板网站建设、高性价比潜山网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式潜山网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖潜山地区。费用合理售后完善,十多年实体公司更值得信赖。1. 什么是递归

程序调用自身的编程技巧称为递归。

递归作为一种算法在程序设计语言中广泛应用。是一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。

同时递归只需少量的程序就可描述出解题过程所需要的多次重复计算,大大减少程序的代码量。

递归的主要思考方式在于:把大事化小

2. 递归的两个必要条件

(1)存在限制条件,当满足这个限制条件的时候,递归便不再继续。

(2)每次递归之后越来越接近这个限制条件。

3. 实例

输入n和k通过函数递归实现计算n的k次方。

代码如下:

#define _CRT_SECURE_NO_WARNINGS
#includeint fac(int x, int y)
{
	while (y != 0)
	{
		if (y >= 2)
		{
			return x * fac(x, y - 1);
		}
		else
		{
			return x;
		}
	}
}
int main()
{
	int n = 0;
	int k = 0;
	scanf("%d %d", &n, &k);
	int num = fac(n, k);
	printf("%d", num);
	return 0;
}

这段代码就很好的体现了递归把大事化小的思考方式,计算n的k次方可以看成n乘以n的k-1次方,这样就可以通过函数递归来实现了 。

4. 递归与迭代

有许多问题是可以使用递归的形式进行解释的,这是因为它比非递归的形式更加清晰而且递归更加简洁。但是这些问题往往使用迭代的方式要比递归的方式效率更高。举例如下:

求第n个斐波那契数

递归方式:

//递归
#define _CRT_SECURE_NO_WARNINGS
#includeint fac(int x)
{
	if (x<= 2)
		return 1;
	else
		return fac(x - 1) + fac(x - 2);
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int num = fac(n);
	printf("%d", num);
	return 0;
}

但是有一个问题当我们输入n的数字大一点的时候它并没有立刻出现结果,假设我输入n=60的时候:

59f344243e1e47189bd0bc33723a7825.png

这是因为数字过大的时候我们会重复计算很多种数值图解如下:

93eb39f2740b45a5ac77ba088f1d8e9a.png

所以对代码进行一些改进,非递归方式:

//非递归
#define _CRT_SECURE_NO_WARNINGS
#includeint fac(int x)
{
	int a = 1;
	int b = 1;
	int c = 1;
	while (x >= 3)
	{
		c = a + b;
		a = b;
		b = c;
		x--;
	}
	return c;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int num=fac(n);
	printf("%d", num);
	return 0;
}

这样问题就可以解决了:

39efd25e63c942f28c7bea4479d3baf6.png

所以在使用递归的时候要适度,不要钻牛角尖哦!

34aacfe9f07b4a0f87e83d05c3f4bbac.png

今天分享到这里,希望大家一起提高!

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


标题名称:初识C语言:函数详解(二)-创新互联
网页网址:http://cdkjz.cn/article/peodc.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220