题解:洛谷 P5739 计算阶乘
【题目来源】
【题目描述】
求 \(n!\),也就是 \(1\times 2\times 3\dots \times n\)。
挑战:尝试不使用循环语句(for、while)完成这个任务。
【输入】
第一行输入一个正整数 \(n\)。
【输出】
输出一个正整数,表示 \(n!\)。
【输入样例】
3
【输出样例】
6
【核心思想】
-
问题分析:给定一个正整数 \(n\),要求计算 \(n! = 1 \times 2 \times \cdots \times n\)。题目明确挑战不使用循环语句,因此必须用递归实现。递归的终止条件是 \(n=1\) 时返回 \(1\),否则返回 \(n \times (n-1)!\)。
-
算法选择:
- 递归函数:定义递归函数
fun(n),若n == 1返回1,否则返回n * fun(n-1)。递归深度为 \(n\),由于 \(n\) 通常较小(题目未明确范围但递归实现需注意栈溢出,一般 \(n \le 20\) 安全),可以正常工作。
- 递归函数:定义递归函数
-
关键步骤:
- 读入:读取正整数
n。 - 递归计算:调用
fun(n),按照递归定义计算阶乘。 - 输出:输出计算结果。
- 读入:读取正整数
-
时间/空间复杂度:
- 时间复杂度:\(O(n)\),递归调用 \(n\) 次。
- 空间复杂度:\(O(n)\),递归调用栈深度为 \(n\)。
-
递归思想:
- 递归定义:阶乘的数学定义本身是递归的:\(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
浙公网安备 33010602011771号