今天学习了函数的阶乘,阶乘就是函数自己调用自己,下面我将用函数的阶乘实现求n的阶乘。不考虑栈溢出,如果考虑栈溢出应该使用迭代。
先展示一下普通的求阶乘。
jiecheng 函数通过两层循环来计算:
1.外层循环遍历从 1 到 n 的每一个数(a)。
2.内层循环计算当前数 a 的阶乘(i 初始化为 1,然后乘以从 1 到 a 的每一个数)。
3.每次内层循环结束后,将计算得到的阶乘累加到 j 上。
最终,函数返回的是 1 到 n 所有数的阶乘之和。
#include <stdio.h>
int jiecheng(int n)
{
int a = 0;
int b = 0;
int i = 0;
int j = 0;
for (a = 1; a <= n; a++)//第一个循环实现每个阶乘之间的相加,如1!+2!+3!……
{
i = 1;//使第一个循环每循环一次,a的值都初始化为1,来供第二个循环使用
for (b = 1; b <= a; b++)//第二个循环实现得到1~n每一个数的阶乘
{
i *= b;
}
j += i;
}
return j;
}
int main()
{
int n;
scanf("%d", &n);
int ret = jiecheng(n);
printf("%d\n",ret );
return 0;
}
然后是函数递归求阶乘
递归函数通常包含两个主要部分:
递归的基本情况(Base Case):
这是递归的结束条件,即当函数参数满足某个条件时,函数将直接返回一个值,而不是继续调用自身。这是防止无限递归的关键。
递归步骤(Recursive Step):
这是函数体中的部分,它调用函数自身,但使用不同的参数(通常是更接近基本情况的参数)。这一步是将问题分解成更小问题的过程。
#include <stdio.h>
int jiecheng(int n)
{
int a = 1;
int b = 0;
if (n == 1 && n != 0)
{
return 1;
}
for (b = 1; b <= n; b++)
{
a *= b;
}
return (a + jiecheng(n - 1));
}
int main()
{
int n;
scanf("%d", &n);
int ret = jiecheng(n);
printf("%d\n", ret);
return 0;
}