C语言——函数的递归

本文介绍了在C语言中递归的概念,探讨了无限递归可能导致的栈溢出问题,通过阶乘计算示例展示了递归的使用和其在处理复杂问题上的优势。同时提到了递归深度过大会消耗大量内存资源,需要借助数据结构中的栈模拟来解决这一问题。
摘要由CSDN通过智能技术生成

在C语言中,递归就是函数自己调用自己

无限递归:函数的调用,都会在内存的栈区上分配空间,如果无限的递归调用函数,就会将栈区空间填满,出现栈区溢出的现象。

递归是个把复杂的问题化成小问题的过程,按照要求通过一个不变的代码,一层层的往下递推,递推到最低层,开始回归,一层层的计算,回归到最上层需要的结果,用简单的代码计算复杂的问题。可以理解为 递推是一个向内逐层深入的过程,回归是一个向外逐层输出的过程。(哈哈哈,文字还是有一点抽象,下面来举一个例子)

阶乘计算问题(这里只研究整数阶乘问题)

一个正整数的阶乘是所有小于及等于该数的正整数的积,特别的:0的阶乘为1。自然数n的阶乘写作n!  定义:n!=1*2*3*......(n-1)*n   例如5!为1*2*3*4*5=120

阶乘递归的方式定义: n=n*(n-1)!

同样的用递归的思想计算5!

0!=1

1!=1

2!=2*1!=1*2=2

3!=3*2!=1*2*3=6

4!=4*3!=1*2*3*4=24

5!=5*4!=1*2*3*4*5=120

计算5的阶乘我们可以把它拆分成一个较小的问题即5*4!,4的阶乘有拆分为4*3!,以此类推直至拆分到1!或 0!。

当计算较小的阶乘时如1!、2!、3!此类较为简单的阶乘运算口算还能计算的出来,略微大一点的如10!依靠计算器你需要依次输入1*2*3*4*5*6*7*8*9*10才能得出计算结果,当更复杂时80!这时就凸现了程序的简便和高效的优点,当你在程序提示框上输入5,你想要的结果瞬间出现在屏幕上,提高了你的计算效率。

下面使用递归的思想设计此程序

#define _CRT_SECURE_NO_WARNINGS 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/n", ret);
	return 0;

 利用上述代码,可以实现阶乘的实际需求。

但是

但是

但是

我相信已经有人发现了问题 同样,我在运行的过程中也发现了,当我所求的数字阶乘过大,程序虽没有报错但不能正常运行出来。

这里递归太深,造成了栈的益处,解决此问题只能等学了数据结构之后,也可以通过栈来模拟递归。解决此问题。

由此我们可能看到C语言中,递归的缺点就是迅速消耗计算机的内存资源,递归太深造成栈的益处,同时简单的解决方案也是递归的优点。

道阻且长,编程学习之路漫漫,行则将至。

  • 23
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值