题目的主要信息:

  • 编写一个函数 long long factorial(int n),用于计算nn的阶乘
  • 要求使用递归实现
  • nn的范围是1-20

具体做法:

首先20的阶乘会超出int型的表示范围,因此题目用到了long long。

一个数的阶乘就是n(n1)(n2)...21n*(n-1)*(n-2)*...*2*1,我们可以将求nn的阶乘看成问题f(n)=n(n1)(n2)...21f(n)=n*(n-1)*(n-2)*...*2*1,而f(n)=nf(n1)f(n)=n*f(n-1),这样我们就将nn的问题化为了n1n-1的子问题,我们不断往前每次递归的nn值乘上子问题的答案就可以了,直到n=1n=1结束递归。

alt

#include <iostream>
using namespace std;

long long factorial(int n);

int main() {

	int n;
	cin >> n;

	cout << factorial(n) << endl; //输出递归结果

	return 0;
}

long long factorial(int n) { //递归函数
    if(n == 1)
        return 1;
    return factorial(n - 1) * n; //递归计算n*f(n-1)
}

复杂度分析:

  • 时间复杂度:O(n)O(n),一共递归nn
  • 空间复杂度:O(n)O(n),需要直接到递归栈最深再往上乘(如图),因此递归栈最大深度也为nn