Python dainganxanh
  • Lời nói đầu
  • Chương I. SƠ LƯỢC
    • Bài 1. Cài đặt môi trường
    • Bài 2. Từ khóa và định danh
    • Bài 3. Câu lệnh, khối lệnh và chú thích
    • Bài 4. Nhập, xuất dữ liệu
    • Bài 5. Toán tử và lệnh gán
    • Bài 6. Biến, Hằng
    • Bài 7. Kiểu dữ liệu
    • Bài 8. Thao tác với tệp (cơ bản)
    • Bài 9. Tổng quan về Python
    • Bài tập chương 1
  • Chương II. RẼ NHÁNH - LẶP
    • Bài 10. Cấu trúc rẽ nhánh if…else
    • Bài 11. Cấu trúc lặp với for
    • Bài 12. Cấu trúc lặp với while
    • Bài 13. Lệnh break và continue
    • Bài tập chương 2
  • Chương III. HÀM & MODULE
    • Bài 14. Hàm
    • Bài 15. Tham số hàm
    • Bài 16. Đệ quy
    • Bài 17. Hàm ẩn danh
    • Bài 18. Biến toàn cục và cục bộ
    • Bài 19. Module
    • Bài 20. Package
  • Chương IV. KIỂU DỮ LIỆU
    • Bài 21. Dữ liệu kiểu số
    • Bài 22. Dữ liệu kiểu string
    • Bài 23. Dữ liệu kiểu list
    • Bài 24. Dữ liệu kiểu tuple
    • Bài 25. Dữ liệu kiểu set
    • Bài 26. Dữ liệu kiểu dictionary
  • Chương V. TỆP & THƯ MỤC
    • Bài 27. Đọc và ghi file
    • Bài 28. Quản lý file và folder
  • Chương VI. LỖI & NGOẠI LỆ
    • Bài 29. Ngoại lệ
    • Bài 30. Xử lý ngoại lệ
    • Bài 31. Xây dựng ngoại lệ
  • Chương VII. HƯỚNG ĐỐI TƯỢNG
    • Bài 32. Lập trình hướng đối tượng
    • Bài 33. Đối tượng và Lớp
    • Bài 34. Kế thừa
    • Bài 35. Đa kế thừa
    • Bài 36. Nạp chồng toán tử
  • Chương VIII. NGÀY - GIỜ
    • Python datetime
    • Python strftime()
    • Python strptime()
    • Current date and time
    • Get Current time
    • Timestamp to datetime
    • Python time Module
    • Python sleep()
  • Chương IX. CHỦ ĐỀ NÂNG CAO
    • Python Iterators
    • Python Generators
    • Python Closures
    • Python Decorators
    • Python @property decorator
    • Python RegEx
    • Python Examples
  • PHỤ LỤC - GHI CHÉP
    • Hàm map()
    • Cài Sublime Text để code Python
    • Ghi chép - ghi chú
    • Mảng 2 chiều
    • Công thức với dãy số
  • Tài liệu tham khảo
  • www.dainganxanh.com
  • 🐍Khóa học Python
  • 🤷‍♀️Hỏi đáp, chia sẻ (FG)
  • 🎮Sinh Test chấm Themis
Powered by GitBook
On this page
  • Hàm đệ quy
  • Ví dụ 2
  • Ví dụ 3
  • Ưu điểm của Đệ quy
  • Nhược điểm của Đệ quy

Was this helpful?

  1. Chương III. HÀM & MODULE

Bài 16. Đệ quy

Hàm đệ quy

Một hàm được gọi là đệ quy khi nó tự gọi lại chính nó nhiều lần đến khi vấn đề được giải quyết.

Một hàm đệ quy cần phải có điều kiện chấm dứt đề dừng việc tự gọi lại chính nó. Hàm đệ quy chấm dứt khi mỗi lần gọi đệ quy thì số giải pháp của vấn đề được giảm bớt và tiến gần đến điều kiện cơ sở. Một điều kiện cơ sở là điểm mà ở đó vấn đề được giải quyết và không cần đệ quy thêm lần nào nữa.

Sau đây là một ví dụ về một hàm đệ quy để tìm giai thừa của một số nguyên.

Giai thừa của một số là tích của tất cả các số nguyên từ 1 đến số đó. Ví dụ, giai thừa của 6 (được ký hiệu là 6!) Là 1 * 2 * 3 * 4 * 5 * 6 = 720.

def giaithua(x):
    """Hàm tính giai thừa của một số nguyên"""
    if x == 1:
        return 1
    else:
        return (x * giaithua(x-1))

num = 6
print(f"Giai thừa của {num} là {giaithua(num)}")

Khi thực hiện gọi hàm giaithua trên đây với tham số truyền vào là num= 6 thì các bước thực hiện sẽ lần lượt như sau:

6 * giaithua(5) # gọi hàm lần thứ nhất 6 * 5 * giaithua(4) # gọi lần 2 6 * 5 * 4 * giaithua(3) # gọi lần 3 6 * 5 * 4 * 3 * giaithua(2) # gọi lần 4 6 * 5 * 4 * 3 * 2 * giaithua(1) # gọi lần 5 - gặp điều kiện cơ sở (x=1) 6 * 5 * 4 * 3 * 2 * 1 # giá trị trả về sau lần gọi cuối

Python mặc định độ duyệt sâu tối đa của hàm đệ quy là 1000 lần. Nếu tự gọi vượt quá số lần cho phép chương trình không trả về kết quả mà báo lỗi RecursionError: maximum recursion depth exceeded.

Ví dụ 2

Tính tổng dãy số nguyên a gồm n phần tử từ 1 đến n.

def tong(n):
    if n == 1:
        return 1
    else:
        return n + tong(n-1)
    
n = 6
print(tong(n))

Ví dụ 3

In dãy fibonacy

def fb(x):
    if (x == 0 or x == 1):
        return x;
    else:
        return fb(x-1) + fb(x-2)
    
n = 10
for i in range(n+1):
    print(fb(i), end=' ')

Ưu điểm của Đệ quy

Đệ quy làm cho mã code gọn gàng, mạch lạc .

Một nhiệm vụ phức tạp có thể được chia thành các bài toán con đơn giản hơn bằng cách sử dụng đệ quy.

Việc tạo trình tự với đệ quy dễ dàng hơn so với việc sử dụng một số phép lặp lồng nhau.

Nhược điểm của Đệ quy

Đôi khi logic đằng sau đệ quy rất khó theo dõi.

Cuộc gọi đệ quy rất tốn kém (không hiệu quả) vì chúng chiếm nhiều bộ nhớ và thời gian.

Các hàm đệ quy rất khó gỡ lỗi.

PreviousBài 15. Tham số hàmNextBài 17. Hàm ẩn danh

Last updated 4 years ago

Was this helpful?