源本科技 | 码上会

递归求阶乘

2026/01/26
10
0

题目

利用递归方法求5!5!

说明

递归三要素

  1. 基准条件n == 0n == 1 时返回 1,防止无限递归。

  2. 递归关系f(n) = n * f(n - 1)

  3. 问题规模缩小:每次调用 f(n-1),使问题向基准条件靠近。


运行示例

当用户输入 5 时,程序输出:

请输入一个数:
5
5的阶乘为:120

若输入 0,输出:

0的阶乘为:1

👈点击左箭头查看答案(一定要在自己思考并实现后再看参考答案哦!)

规律分析

n

递归调用栈(从上到下)

返回值

5

fac(5) → fac(4) → fac(3) → fac(2) → fac(1)

120

3

fac(3) → fac(2) → fac(1)

6

1

直接返回

1

  • 每次函数调用都会在内存中创建新的栈帧,直到达到基准条件。

  • 然后逐层返回,完成乘法运算。

  • 递归简洁优雅,但对大 n 可能导致栈溢出(Stack Overflow)(Java 默认栈深度约几千层,n=5 完全安全)。


程序实现

import java.util.Scanner;

public class Demo22 {
    /**
     * 使用递归计算 n 的阶乘
     * @param n 非负整数
     * @return n!
     */
    public static long fac(int n) {
        // 基准条件:0! = 1, 1! = 1
        if (n == 0 || n == 1) {
            return 1;
        }
        // 递归关系:n! = n * (n-1)!
        return n * fac(n - 1);
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.print("请输入一个非负整数:");
        int n = in.nextInt();
        
        if (n < 0) {
            System.out.println("阶乘仅对非负整数定义!");
        } else {
            System.out.println(n + "的阶乘为:" + fac(n));
        }
        in.close();
    }
}

补充知识

  • 递归 vs 迭代

    • 递归代码简洁,逻辑清晰,适合数学定义天然递归的问题(如阶乘、斐波那契、树遍历)。

    • 迭代(循环)效率更高,无栈开销,适合性能敏感或深度大的场景。

  • 尾递归优化:某些语言(如 Scala、Scheme)支持尾递归优化,可将递归转为循环避免栈溢出,但 Java 不支持尾递归优化

  • 阶乘增长极快20! ≈ 2.43×10¹⁸long 能表示的最大阶乘,21! 就会溢出。若需更大阶乘,应使用 BigInteger