C语言——函数的递归

在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语言中,递归的缺点就是迅速消耗计算机的内存资源,递归太深造成栈的益处,同时简单的解决方案也是递归的优点。

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

猜你喜欢

转载自blog.csdn.net/xupy019/article/details/138212372