Thuật toánđệquy 1. Định nghĩa Ta nói một đối tượng là đệquy nếu nó được định nghĩa qua chính nó hoặc một đối tượng khác cùng dạng với chính nó bằng quy nạp. Nếu lời giải của một bài toán T được thực hiện bằng lời giải của bài toán T’ có dạng giống T thì đó là một lời giải đệ quy. Giải thuật tương ứng với lời giải như vậy được gọi là giải thuậtđệ quy. Chú ý, T’ có dạng giống T nhưng theo một nghĩa nào đó thì T’ phải “nhỏ” hơn T, dễ giải hơn T và việc giải T’ không phụ thuộc vào T. Ta đã biết đến khá nhiều vídụ nổi tiếng về bài toánđệquy và lời giải của nó như : bài toán tháp Hà Nội, số Fibonacci … Định nghĩa một hàm đệquy như sau: -Phần neo: Phần này sẽ được thực hiện khi công việc quá đơn giản, có thể giải trực tiếp, nhanh chóng mà không cần nhờ đến một bài toán con nào. -Phần đệ quy: Thực hiện khi bài toán phức tạp hơn, chưa thể giải được bằng phần neo, ta xác định những bài toán con và đệquyđể giải những bài đó. Khi đã có lời giải của những bài toán con rồi thì phối hợp lại để giải bài toán gốc. Phần đệquy thể hiện tính quy nạp của thuật toánđệ quy. Vì mỗi lần gọi đệquy bộ nhớ sẽ cần 1 lưu trữ 1 vùng nhớ mới trong khi vùng nhớ cũ vẫn phải duy trì, nên trong các ứng dụng thực tế số lần gọi đệquy không những phải hữu hạn mà còn phải đủ nhỏ. 2. Các dạng đệquy thông thường 2.1 Đệquy tuyến tính Có dạng: P = { if thỏa điều kiện dừng then thực hiện S; else {thực hiện S*; gọi P} } (S, S* là các thao tác không đệ quy) Ví dụ: hàm tính số hạng n của dãy n! 2.2 Đệquy nhị phân Có dạng: P= {if thỏa điều kiện dừng thenthực hiện S; else {thực hiện S*; gọi P; gọi P} } (S, S* là các thao tác không đệ quy) Ví dụ: hàm tính số hạng n của dãy Fibonacci 2.3 Đệquy phi tuyến Có dạng P= {forgiá trị đầu to giá trị cuối do {thực hiện S; if(thỏa điều kiện dừng) then thực hiện S* else gọi P } } Ví dụ: tính X n theo công thức truy hồi: X 0 = 1; X n = n 2 X 0 + (n-1) 2 X 1 + … + 2 2 X n-2 + 1 2 X n-1 2.4 Đệ quy quay lui Có dạng P= { for giá trị đầu to giá trị cuối do {thực hiện S; if(thỏa điều kiện) then {gọi P; Trả lại giá trị ban đầu cho S} } } Ví dụ: thủ tục tìm kiếm theo chiều sâu Các bạn thấy đấy, thuật toánđệquy là một thuậttoán lập trình khá đơn giản, khá dễ dàng áp dụng cho các bài toán, nhưng khi lập trình các bạn nên lưu ý đến dung lượng bộ nhớ. Chúc các bạn thành công ! . } Ví dụ: thủ tục tìm kiếm theo chiều sâu Các bạn thấy đấy, thuật toán đệ quy là một thuật toán lập trình khá đơn giản, khá dễ dàng áp dụng cho các bài toán, . của những bài toán con rồi thì phối hợp lại để giải bài toán gốc. Phần đệ quy thể hiện tính quy nạp của thuật toán đệ quy. Vì mỗi lần gọi đệ quy bộ nhớ sẽ