Bỏ qua

Giai thừa

Tóm lược nội dung

Bài này trình bày bài toán tính giai thừa bằng kỹ thuật đệ quy.

Bài toán

Yêu cầu:
Sử dụng kỹ thuật đệ quy, viết chương trình tính \(n!\).

Biết rằng \(0! = 1\) và \(1! = 1\).

Input:
Số nguyên dương \(n\).

Output:
Một số nguyên là giai thừa của \(n\).

Test case:

STT Input Output
1 0 1
2 1 1
3 6 720
4 21 51090942171709440000

Bài giải đề xuất

Ý tưởng chính

Ta có công thức truy hồi tính giai thừa như sau:

\[ n! = \begin{cases} 1 & \text{nếu } n = 0 \text{ hoặc } n = 1 \\ (n - 1)! \times n & \text{nếu } n > 1 \\ \end{cases} \]

Theo công thức trên:

  1. Trường hợp cơ sở: \(n == 0\) hoặc \(n == 1\).

    Không cần gọi đệ quy nữa, mà chỉ trả về 1.

  2. Trường hợp đệ quy: các giá trị \(n\) còn lại. Giả sử không nhập n nguyên âm.

    Hàm sẽ gọi lại chính nó, tham số truyền vào là n - 1 để tính \((n - 1)!\), rồi nhân thêm \(n\).

    Ví dụ:
    Để tính \(5!\), hàm sẽ gọi lại chính nó để tính \((5 - 1)! = 4!\), rồi nhân thêm \(5\).

    Cụ thể:

    • Hàm factorial(5) gọi đệ quy factorial(4).
    • Hàm factorial(4) gọi đệ quy factorial(3).
    • Hàm factorial(3) gọi đệ quy factorial(2).
    • Hàm factorial(2) gọi đệ quy factorial(1).
    • Hàm factorial(1) không gọi đệ quy nữa, mà sẽ trả về 1.
Viết chương trình

1. Viết hàm factorial() gồm có một tham số là n.

1
2
3
4
5
6
7
def factorial(n):
    # Trường hợp cơ sở
    if n == 0 or n == 1:
        return 1

    # Trường hợp đệ quy
    return factorial(n - 1) * n

2. Viết chương trình chính:

  • Cho người dùng nhập vào một số nguyên dương, lưu vào biến number.
  • Gọi hàm factorial() ra thực hiện, lưu kết quả vào biến result.
  • In ra kết quả.
if __name__ == '__main__':
    number = int(input('Nhập số nguyên không âm: '))

    result = factorial(number)
    print(f'{number}! = {result}')

3. Chạy chương trình, nhập vào 6, kết quả như sau:

Nhập số nguyên không âm: 6
6! = 720

Mã nguồn

Code đầy đủ được đặt tại: