在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语言中,递归的缺点就是迅速消耗计算机的内存资源,递归太深造成栈的益处,同时简单的解决方案也是递归的优点。
道阻且长,编程学习之路漫漫,行则将至。