题解:洛谷 P5739 计算阶乘

【题目来源】

洛谷:P5739 【深基7.例7】计算阶乘 - 洛谷

【题目描述】

\(n!\),也就是 \(1\times 2\times 3\dots \times n\)

挑战:尝试不使用循环语句(for、while)完成这个任务。

【输入】

第一行输入一个正整数 \(n\)

【输出】

输出一个正整数,表示 \(n!\)

【输入样例】

3

【输出样例】

6

【核心思想】

  1. 问题分析:给定一个正整数 \(n\),要求计算 \(n! = 1 \times 2 \times \cdots \times n\)。题目明确挑战不使用循环语句,因此必须用递归实现。递归的终止条件是 \(n=1\) 时返回 \(1\),否则返回 \(n \times (n-1)!\)

  2. 算法选择

    • 递归函数:定义递归函数 fun(n),若 n == 1 返回 1,否则返回 n * fun(n-1)。递归深度为 \(n\),由于 \(n\) 通常较小(题目未明确范围但递归实现需注意栈溢出,一般 \(n \le 20\) 安全),可以正常工作。
  3. 关键步骤

    • 读入:读取正整数 n
    • 递归计算:调用 fun(n),按照递归定义计算阶乘。
    • 输出:输出计算结果。
  4. 时间/空间复杂度

    • 时间复杂度:\(O(n)\),递归调用 \(n\) 次。
    • 空间复杂度:\(O(n)\),递归调用栈深度为 \(n\)
  5. 递归思想

    • 递归定义:阶乘的数学定义本身是递归的:\(n! = n \times (n-1)!\)\(0! = 1\)(或 \(1! = 1\))。
    • 终止条件:必须有一个明确的终止条件,否则递归会无限进行。本题中当 \(n=1\) 时返回 \(1\)
    • 递归 vs 循环:虽然任何递归都可以用循环替代,但本题旨在训练递归思维。
    • 适用场景:递归适用于问题可以分解为相同结构的子问题,如阶乘、斐波那契数列、树遍历等。

【算法标签】

入门 #递归

【代码详解】

#include <bits/stdc++.h>  // 包含标准库头文件(万能头文件)
using namespace std;      // 使用标准命名空间

/**
 * 递归计算阶乘函数
 * @param n 要计算阶乘的数字
 * @return n的阶乘结果
 */
int fun(int n)
{
    if (n == 1)          // 基本情况:1的阶乘为1
    {
        return 1;
    }
    else                  // 递归情况:n! = n * (n-1)!
    {
        return n * fun(n - 1);
    }
}

int main()
{
    int n;                // 定义变量:存储用户输入的数字
    int ans;              // 定义变量:存储阶乘计算结果

    cin >> n;             // 输入要计算阶乘的数字

    ans = fun(n);         // 调用阶乘函数计算结果

    cout << ans;          // 输出阶乘结果

    return 0;             // 程序正常结束
}

【运行结果】

3
6
posted @ 2026-09-01 09:25  团爸讲算法  阅读(16)  评论(0)    收藏  举报