初识C语言:函数详解(二)

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

1. 什么是递归

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

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

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

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

 2. 递归的两个必要条件

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

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

3. 实例

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

代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int 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
#include<stdio.h>
int 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
#include<stdio.h>
int 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

 

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值