【C语言——函数递归总结】

本文介绍了递归的基本概念,包括递归的定义和递归思想,以及递归在计算阶乘和斐波那契数中的应用。同时讨论了递归的限制条件,并指出在某些情况下,迭代可能更为高效。最后强调了递归的合理使用及其潜在问题。
摘要由CSDN通过智能技术生成

一.函数递归的概念

递归其实就是解决问题的办法,在C语言中,递归就是函数自己调用自己。

递:递推的意思。归:回归的意思。

 递归的思想:

把一个大型的问题层层转换成与原问题相似,但规模较小的问题来求解,直到子问题不能被再拆分,递归就结束了。所以递归的思想就是大事化小的过程。

二.递归的限制条件

递归在书写的时候有两个必要的条件:

  • 递归存在限制条件,当满足这个限制条件的时候,递归便不再继续。
  • 每次递归调用之后越来越接近这个条件。

三.递归的举例

代码举例:求n的阶乘

题目:计算n的阶乘(不考虑溢出),n的阶乘就是1~n的数字积相乘。

 分析和代码实现:

我们可以由阶乘的计算公式n!=n*(n-1)!总结出它的递推公式:

那么我们就可以写出函数Fact(n)就是求n的阶乘,那么Fact(n-1)就是求n-1的阶乘,函数如下:

int Fact(int n)
{
	if (n == 0)
		return 1;
	else
		return n * Fact(n - 1);
}

测试:

#include <stdio.h>
int Fact(int n)
{
	if (n == 0)
		return 1;
	else
		return n * Fact(n - 1);
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = Fact(n);
	printf("%d", ret);
	return 0;
}

运行结果(这里不考虑n太大的情况,n太大存在溢出):

画图推演:

四.递归与迭代(循环)

递归是一种很好的编程技巧,和很多编程技巧一样,也是可能被误用的。

事实上,我们看到的许多问题是以递归的形式进行解释的,这只是因为它比非递归的形式更加清晰,但是这些问题的迭代实现,往往比递归实现效率更高。

当一个问题很复杂时,难以使用迭代的方式实现时,此时递归实现的简洁便可以补偿它所带来的运行时开销。

SUM:

1.如果说一个问题的使用递归去写的时候,写起来很简单,并且写出来没有明显的问题,就可以使用递归。

2.但是如果使用递归存在明显的问题,那就得想办法写成迭代(循环)的方式。

代码举例: 

求第n个斐波拉契数。

对于这问题我们是用递归的方式描述,用迭代的方式进行写代码。

#include <stdio.h>
int Fib(int n)
{
	int a = 1;
	int b = 1;
	int c = 1;
	while (n > 2)
	{
		c = a + b;
		a = b;
		b = c;
		n--;
	}
	return c;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int m=Fib(n);
	printf("%d", m);
}

PS:递归虽好,但请不要迷恋递归!

关注博主,优质内容不断更新!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小峰编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值