Rate this post

Bài 87: Viết hàm tính giai thừa n! trong Python

Giới Thiệu

Giai thừa của một số nguyên dương n (ký hiệu là n!) là tích của tất cả các số nguyên dương từ 1 đến n. Bài viết này hướng dẫn hai cách viết một hàm Python để tính giai thừa: cách sử dụng vòng lặp và cách tối ưu hóa bằng đệ quy hoặc thư viện có sẵn.

Khuyến mãi đặc biệt thêm danh sách 10 bài tập nâng cao khả năng lập trình Python:

  1. Bài 81: Đếm số ký tự thường trong xâu bằng Python
  2. Bài 82: Tìm tên của một người trong chuỗi họ và tên bằng Python
  3. Bài 83 Tìm họ và chữ lót của một người từ chuỗi họ và tên bằng Python
  4. Bài 84: Tính chu vi và diện tích của tam giác có sử dụng hàm trong Python
  5. Bài 85: Viết hàm kiểm tra chia hết cho 5 trong Python
  6. Bài 86: Viết hàm tìm Ước Chung Lớn Nhất (UCLN) trong Python
  7. Bài 87: Viết hàm tính giai thừa n! trong Python
  8. Bài 88: Viết hàm P(x, n) để tính giá trị x^n trong Python
  9. Bài 89: Vẽ hình chữ nhật bằng dấu * trong Python
  10. Bài 90: Sử dụng hàm lồng nhau trong Python

Cách Thực Hiện

Cách 1: Sử dụng vòng lặp (Cách thông thường)

  1. Khởi tạo biến kết quả factorial là 1.
  2. Dùng vòng lặp để nhân các số từ 1 đến n.
  3. Trả về kết quả giai thừa.

 

def tinh_giai_thua_vong_lap(n):

    if n == 0 or n == 1:

        return 1

    factorial = 1

    for i in range(2, n + 1):

        factorial *= i

    return factorial

Cách 2: Sử dụng đệ quy (Cách tối ưu hơn)

  1. Trường hợp cơ bản: nếu n = 0 hoặc n = 1, trả về 1.
  2. Trường hợp tổng quát: n! = n × (n-1)!, gọi lại hàm với n-1.

 

def tinh_giai_thua_de_quy(n):

    if n == 0 or n == 1:

        return 1

    return n * tinh_giai_thua_de_quy(n - 1)

 

Cách 3: Sử dụng thư viện math (Cách tối ưu nhất)

Python cung cấp hàm math.factorial() giúp tính giai thừa nhanh chóng và tối ưu hơn.

 

import math
def tinh_giai_thua_math(n):
    return math.factorial(n)

 

Chương Trình Hoàn Chỉnh

 

import math
def tinh_giai_thua_vong_lap(n):
    if n == 0 or n == 1:
        return 1
    factorial = 1
    for i in range(2, n + 1):
        factorial *= i
    return factorial
def tinh_giai_thua_de_quy(n):
    if n == 0 or n == 1:
        return 1
    return n * tinh_giai_thua_de_quy(n - 1)
def tinh_giai_thua_math(n):
    return math.factorial(n)
# Nhập số nguyên dương n
n = int(input("Nhập số nguyên dương n: "))
if n >= 0:
    print(f"Giai thừa theo vòng lặp của {n}! là: {tinh_giai_thua_vong_lap(n)}")
    print(f"Giai thừa theo đệ quy của {n}! là: {tinh_giai_thua_de_quy(n)}")
    print(f"Giai thừa theo thư viện math của {n}! là: {tinh_giai_thua_math(n)}")
else:
    print("Vui lòng nhập số nguyên không âm.")

Ví Dụ Chạy Chương Trình

Nhập số nguyên dương n: 5

Giai thừa theo vòng lặp của 5! là: 120

Giai thừa theo đệ quy của 5! là: 120

Giai thừa theo thư viện math của 5! là: 120

So Sánh Ba Cách

Phương pháp Ưu điểm Nhược điểm
Vòng lặp Không cần gọi lại nhiều lần, dễ hiểu Có thể chậm với n rất lớn
Đệ quy Code ngắn gọn, dễ đọc Có thể gây lỗi tràn bộ nhớ nếu n quá lớn
math.factorial() Tối ưu nhất, nhanh chóng Phụ thuộc vào thư viện math

Kết Luận

Cả ba cách đều cho kết quả chính xác. Nếu bạn muốn hiểu rõ thuật toán, hãy dùng vòng lặp. Nếu thích cách tiếp cận đệ quy, hãy thử cách 2. Nếu cần hiệu suất tốt nhất, hãy sử dụng math.factorial(). Hy vọng bài viết hữu ích cho bạn!

Vi Tính Tấn Dân

Mình rất đam mê về máy vi tính và máy in. Và mình đã đeo đuổi ước mơ và làm việc về máy vi tính mới đây mà đã 15 năm. Mình thích chia sẻ mọi kiến thức và kinh nghiệm mà mình có được cho tất cả các bạn ! Trong khi mình viết nếu có điều gì thiếu sót mong các bạn thông cảm cho mình nhé ! Mình Cám ơn trước !

Published by
Vi Tính Tấn Dân

Recent Posts

100 triệu là mức lương của lập trình Python vì sao?

100 triệu là mức lương của lập trình Python vì sao? 1. Vì sao Python…

4 ngày ago

This website uses cookies.