1. 题目

计算阶乘10!,也就是求10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 的结果。

2. 分析

  1. 阶乘概念
    一个正整数的阶乘(用符号“!”表示)是所有小于及等于该数的正整数的乘积。例如,n的阶乘表示为n!,其计算公式为n! = 1×2×3×…×(n - 1)×n(n为正整数且n ≥ 1),同时规定0! = 1。
  2. 实现分析
  • 递归实现思路
  • 递归是解决阶乘问题的一种直观方式。对于n!,可以将其分解为n × (n - 1)!,这就构成了递归关系。即当n等于1时,返回1(因为1! = 1),当n大于1时,返回n乘以(n - 1)!,通过不断调用自身函数来逐步计算出阶乘的值。
  • 优点在于代码简洁,逻辑清晰地体现了阶乘的数学定义,对于理解递归思想很有帮助。不过,如果计算的阶乘数过大,可能会导致栈溢出问题,因为递归调用会占用较多的栈空间。
  • 迭代实现思路
  • 可以使用循环结构来实现阶乘计算。通过一个变量(比如初始化为1),从1开始依次乘以2、3、4……直到乘到目标数n为止,每次迭代都更新这个变量的值,使其累乘当前的数字,最终得到n!的值。
  • 这种方式相对更节省栈空间,效率在一般情况下比较稳定,适用于各种规模(只要结果在数据类型可表示范围内)的阶乘计算,不会像递归那样容易出现栈溢出问题,但代码看起来可能没有递归方式那么简洁地体现数学定义。

3. 实例代码

实现方式一:递归实现

#include <stdio.h>

// 递归函数计算阶乘
int factorialRecursive(int n) {
    if (n == 0 || n == 1) {
        return 1;
    } else {
        return n * factorialRecursive(n - 1);
    }
}

int main() {
    int result = factorialRecursive(10);
    printf("10! 的结果(递归实现):%d\n", result);
    return 0;
}

优势和可用之处
- 优势:代码结构简单直观,与阶乘的数学定义紧密贴合,能很清晰地展现递归算法的应用场景,方便理解递归的工作原理以及阶乘的递归性质。
- 可用之处:适用于计算较小规模的阶乘数值,在不会引发栈溢出的情况下,可以快速得到结果,代码书写方便快捷。

实现方式二:迭代实现

#include <stdio.h>

int main() {
    int result = 1;
    for (int i = 1; i <= 10; i++) {
        result *= i;
    }
    printf("10! 的结果(迭代实现):%d\n", result);
    return 0;
}

优势和可用之处
- 优势:运行效率相对稳定,不受递归深度限制,不会出现因递归调用过多而导致栈溢出的情况,能够可靠地计算较大数值范围内的阶乘(只要结果能在所用数据类型表示范围内),对系统资源的利用更为合理。
- 可用之处:在实际应用中,如果需要计算各种规模的阶乘数值,尤其是对性能和稳定性要求较高的场景,迭代实现方式是比较好的选择。

4. 输出结果

10! 的结果(递归实现):3628800