C语言| 函数的递归调用
【递归求n!】
0!=1; 1!=1
n!= n*(n-1)*(n-2)*(n-3)*...*3*2*1;
【分析过程】
定义一个求n!的函数,主函数直接调用
[ Factorial()函数 ]
1 用if语句去实现,把求n!的情况列举出来
2 if条件有3个,n<0; n==0||n==1; n>1
[ 主函数 ]
定义变量,通过键盘输入任意值,调用Factorial函数求n!
[注]
n的值不要太大,不然容易溢出,long类型也放不下。
递归编写的程序简单,但是运行效率很低。
举例 求4!
1 调用Factorial()函数==Factorial(4),为它分配栈的空间。
“要求4!必须先求3!”,所以把Factorial(4)压入栈中,重新调用Factorial()函数。
2 为Factorial(3)分配栈的空间
“要求3!必须先求2!”,所以把Factorial(3)压入栈中,重新调用Factorial()函数。
3 为Factorial(2)分配栈的空间
“要求2!必须先求1!”,所以把Factorial(2)压入栈中,重新调用Factorial()函数。
4 为Factorial(1)分配栈的空间,调用Factorial(1)的结果是return 1,得到一个值。
此时,这就是求出最小事件的值。
5 当前运行的程序都在栈顶,栈{先进后出},再一个个出栈,释放内存空间。
求到Factorial(4),把值返回给main()函数,释放Factorial(4)的内存空间,结束函数调用。
【递归思想】从上到下逐层分解,从下到上逐层合并。
递归一次就要压栈一次,就要申请一次栈的空间,最后得到最小事件的值,还要逐个出栈,释放内存空间。
不到万不得已不建议使用递归算法,费时又费空间。
【程序代码】
#include <stdio.h>
long Factorial(int n); //函数声明
int main(void)
{
int n;
printf("请输入n的值(<=33):");
scanf("%d",&n);
printf("%d!=%1d\n", n, Factorial(n));
return 0;
}
//定义一个求n!的函数,阶乘的单词为factorial
long Factorial(int n)
{
if(n<0)
{
return -1;
}
else if(n==0 || n==1)
{
return 1;
}
else
{
return n * Factorial(n-1);
}
}