Sáng kiến kinh nghiệm, SKKN - ỨNG DỤNG THUẬT TOÁN ĐỆ QUY - KHỬ ĐỆ QUY TRONG GIẢNG DẠY BỒI DƯỠNG HỌC SINH GIỎISáng kiến kinh nghiệm, SKKN - ỨNG DỤNG THUẬT TOÁN ĐỆ QUY - KHỬ ĐỆ QUY TRONG GIẢNG DẠY BỒI DƯỠNG HỌC SINH GIỎISáng kiến kinh nghiệm, SKKN - ỨNG DỤNG THUẬT TOÁN ĐỆ QUY - KHỬ ĐỆ QUY TRONG GIẢNG DẠY BỒI DƯỠNG HỌC SINH GIỎISáng kiến kinh nghiệm, SKKN - ỨNG DỤNG THUẬT TOÁN ĐỆ QUY - KHỬ ĐỆ QUY TRONG GIẢNG DẠY BỒI DƯỠNG HỌC SINH GIỎISáng kiến kinh nghiệm, SKKN - ỨNG DỤNG THUẬT TOÁN ĐỆ QUY - KHỬ ĐỆ QUY TRONG GIẢNG DẠY BỒI DƯỠNG HỌC SINH GIỎISáng kiến kinh nghiệm, SKKN - ỨNG DỤNG THUẬT TOÁN ĐỆ QUY - KHỬ ĐỆ QUY TRONG GIẢNG DẠY BỒI DƯỠNG HỌC SINH GIỎISáng kiến kinh nghiệm, SKKN - ỨNG DỤNG THUẬT TOÁN ĐỆ QUY - KHỬ ĐỆ QUY TRONG GIẢNG DẠY BỒI DƯỠNG HỌC SINH GIỎISáng kiến kinh nghiệm, SKKN - ỨNG DỤNG THUẬT TOÁN ĐỆ QUY - KHỬ ĐỆ QUY TRONG GIẢNG DẠY BỒI DƯỠNG HỌC SINH GIỎISáng kiến kinh nghiệm, SKKN - ỨNG DỤNG THUẬT TOÁN ĐỆ QUY - KHỬ ĐỆ QUY TRONG GIẢNG DẠY BỒI DƯỠNG HỌC SINH GIỎISáng kiến kinh nghiệm, SKKN - ỨNG DỤNG THUẬT TOÁN ĐỆ QUY - KHỬ ĐỆ QUY TRONG GIẢNG DẠY BỒI DƯỠNG HỌC SINH GIỎISáng kiến kinh nghiệm, SKKN - ỨNG DỤNG THUẬT TOÁN ĐỆ QUY - KHỬ ĐỆ QUY TRONG GIẢNG DẠY BỒI DƯỠNG HỌC SINH GIỎISáng kiến kinh nghiệm, SKKN - ỨNG DỤNG THUẬT TOÁN ĐỆ QUY - KHỬ ĐỆ QUY TRONG GIẢNG DẠY BỒI DƯỠNG HỌC SINH GIỎISáng kiến kinh nghiệm, SKKN - ỨNG DỤNG THUẬT TOÁN ĐỆ QUY - KHỬ ĐỆ QUY TRONG GIẢNG DẠY BỒI DƯỠNG HỌC SINH GIỎISáng kiến kinh nghiệm, SKKN - ỨNG DỤNG THUẬT TOÁN ĐỆ QUY - KHỬ ĐỆ QUY TRONG GIẢNG DẠY BỒI DƯỠNG HỌC SINH GIỎISáng kiến kinh nghiệm, SKKN - ỨNG DỤNG THUẬT TOÁN ĐỆ QUY - KHỬ ĐỆ QUY TRONG GIẢNG DẠY BỒI DƯỠNG HỌC SINH GIỎISáng kiến kinh nghiệm, SKKN - ỨNG DỤNG THUẬT TOÁN ĐỆ QUY - KHỬ ĐỆ QUY TRONG GIẢNG DẠY BỒI DƯỠNG HỌC SINH GIỎISáng kiến kinh nghiệm, SKKN - ỨNG DỤNG THUẬT TOÁN ĐỆ QUY - KHỬ ĐỆ QUY TRONG GIẢNG DẠY BỒI DƯỠNG HỌC SINH GIỎISáng kiến kinh nghiệm, SKKN - ỨNG DỤNG THUẬT TOÁN ĐỆ QUY - KHỬ ĐỆ QUY TRONG GIẢNG DẠY BỒI DƯỠNG HỌC SINH GIỎISáng kiến kinh nghiệm, SKKN - ỨNG DỤNG THUẬT TOÁN ĐỆ QUY - KHỬ ĐỆ QUY TRONG GIẢNG DẠY BỒI DƯỠNG HỌC SINH GIỎISáng kiến kinh nghiệm, SKKN - ỨNG DỤNG THUẬT TOÁN ĐỆ QUY - KHỬ ĐỆ QUY TRONG GIẢNG DẠY BỒI DƯỠNG HỌC SINH GIỎISáng kiến kinh nghiệm, SKKN - ỨNG DỤNG THUẬT TOÁN ĐỆ QUY - KHỬ ĐỆ QUY TRONG GIẢNG DẠY BỒI DƯỠNG HỌC SINH GIỎISáng kiến kinh nghiệm, SKKN - ỨNG DỤNG THUẬT TOÁN ĐỆ QUY - KHỬ ĐỆ QUY TRONG GIẢNG DẠY BỒI DƯỠNG HỌC SINH GIỎISáng kiến kinh nghiệm, SKKN - ỨNG DỤNG THUẬT TOÁN ĐỆ QUY - KHỬ ĐỆ QUY TRONG GIẢNG DẠY BỒI DƯỠNG HỌC SINH GIỎISáng kiến kinh nghiệm, SKKN - ỨNG DỤNG THUẬT TOÁN ĐỆ QUY - KHỬ ĐỆ QUY TRONG GIẢNG DẠY BỒI DƯỠNG HỌC SINH GIỎISáng kiến kinh nghiệm, SKKN - ỨNG DỤNG THUẬT TOÁN ĐỆ QUY - KHỬ ĐỆ QUY TRONG GIẢNG DẠY BỒI DƯỠNG HỌC SINH GIỎISáng kiến kinh nghiệm, SKKN - ỨNG DỤNG THUẬT TOÁN ĐỆ QUY - KHỬ ĐỆ QUY TRONG GIẢNG DẠY BỒI DƯỠNG HỌC SINH GIỎISáng kiến kinh nghiệm, SKKN - ỨNG DỤNG THUẬT TOÁN ĐỆ QUY - KHỬ ĐỆ QUY TRONG GIẢNG DẠY BỒI DƯỠNG HỌC SINH GIỎISáng kiến kinh nghiệm, SKKN - ỨNG DỤNG THUẬT TOÁN ĐỆ QUY - KHỬ ĐỆ QUY TRONG GIẢNG DẠY BỒI DƯỠNG HỌC SINH GIỎISáng kiến kinh nghiệm, SKKN - ỨNG DỤNG THUẬT TOÁN ĐỆ QUY - KHỬ ĐỆ QUY TRONG GIẢNG DẠY BỒI DƯỠNG HỌC SINH GIỎISáng kiến kinh nghiệm, SKKN - ỨNG DỤNG THUẬT TOÁN ĐỆ QUY - KHỬ ĐỆ QUY TRONG GIẢNG DẠY BỒI DƯỠNG HỌC SINH GIỎISáng kiến kinh nghiệm, SKKN - ỨNG DỤNG THUẬT TOÁN ĐỆ QUY - KHỬ ĐỆ QUY TRONG GIẢNG DẠY BỒI DƯỠNG HỌC SINH GIỎISáng kiến kinh nghiệm, SKKN - ỨNG DỤNG THUẬT TOÁN ĐỆ QUY - KHỬ ĐỆ QUY TRONG GIẢNG DẠY BỒI DƯỠNG HỌC SINH GIỎISáng kiến kinh nghiệm, SKKN - ỨNG DỤNG THUẬT TOÁN ĐỆ QUY - KHỬ ĐỆ QUY TRONG GIẢNG DẠY BỒI DƯỠNG HỌC SINH GIỎISáng kiến kinh nghiệm, SKKN - ỨNG DỤNG THUẬT TOÁN ĐỆ QUY - KHỬ ĐỆ QUY TRONG GIẢNG DẠY BỒI DƯỠNG HỌC SINH GIỎISáng kiến kinh nghiệm, SKKN - ỨNG DỤNG THUẬT TOÁN ĐỆ QUY - KHỬ ĐỆ QUY TRONG GIẢNG DẠY BỒI DƯỠNG HỌC SINH GIỎISáng kiến kinh nghiệm, SKKN - ỨNG DỤNG THUẬT TOÁN ĐỆ QUY - KHỬ ĐỆ QUY TRONG GIẢNG DẠY BỒI DƯỠNG HỌC SINH GIỎISáng kiến kinh nghiệm, SKKN - ỨNG DỤNG THUẬT TOÁN ĐỆ QUY - KHỬ ĐỆ QUY TRONG GIẢNG DẠY BỒI DƯỠNG HỌC SINH GIỎISáng kiến kinh nghiệm, SKKN - ỨNG DỤNG THUẬT TOÁN ĐỆ QUY - KHỬ ĐỆ QUY TRONG GIẢNG DẠY BỒI DƯỠNG HỌC SINH GIỎI
Trang 1SỞ GIÁO DỤC VÀ ĐÀO TẠO QUẢNG TRỊ
TRƯỜNG THPT HƯỚNG HÓA
SÁNG KIẾN KINH NGHIỆM
Hướng Hóa, Tháng 7 năm 2020
Trang 2MỤC LỤC
PHẦN I ĐẶT VẤN ĐỀ 4
1 LÝ DO CHỌN ĐỀ TÀI 4
2 MỤC ĐÍCH NGHIÊN CỨU 4
3 ĐỐI TƯỢNG NGHIÊN CỨU 5
4 ĐỐI TƯỢNG KHẢO SÁT, THỰC NGHIỆM 5
5 PHƯƠNG PHÁP NGHIÊN CỨU 5
6 PHẠM VI VÀ THỜI GIAN NGHIÊN CỨU 5
PHẦN II NỘI DUNG 6
1 THUẬT TOÁN ĐỆ QUY 6
1.1 Khái niệm 6
1.2 Phân loại 7
1.3 Thuật toán đệ quy 8
1.4 Chương trình con đệ quy 11
1.4.1 Hàm đệ quy 11
1.4.2 Thủ tục đệ quy 11
1.5 Các bước xây dựng chương trình con đệ quy 12
1.6 Cơ chế thực hiện thuật toán đệ quy 13
1.7 Một số bài toán về đệ quy 15
1.7.1 Bài toán tháp Hà Nội 15
1.7.2 Bài toán chia thưởng 18
1.7.3 Bài toán sắp xếp mảng – Thuật toán sắp xếp nhanh 20
1.7.4 Bài toán tìm kiếm – Thuật toán tìm kiếm nhị phân 24
2 KỸ THUẬT KHỬ ĐỆ QUY 27
2.1 Lý do sử dụng kỹ thuật khử đệ quy 27
2.2 Một số kỹ thuật khử đệ quy đơn giản 28
2.3 Khử một số dạng đệ quy thường gặp 28
2.4 Nhận xét chung về kỹ thuật khử đệ quy 31
PHẦN III KẾT LUẬN VÀ KIẾN NGHỊ 32
I KẾT LUẬN 32
II KIẾN NGHỊ 32
TÀI LIỆU THAM KHẢO 33
Trang 3PHẦN I ĐẶT VẤN ĐỀ
1 LÝ DO CHỌN ĐỀ TÀI
Việc nâng cao chất lượng giáo dục mũi nhọn là một vấn đề cấp thiết hiệnnay được nhà trường và toàn ngành giáo dục tỉnh nhà đặc biệt quan tâm, chútrọng Bồi dưỡng học sinh giỏi là một nhiệm vụ quan trọng không thể thiếu củangành giáo dục nói chung và của các trường nói riêng đặc biệt là đối với mỗimột giáo viên tham gia bồi dưỡng thì đây là một nhiệm vụ không dễ dàng
Bồi dưỡng học sinh giỏi là cả một quá trình, không thể ngày một ngày hai,
mà phải có tính chiến lược dài trong suốt cả một quá trình, có thể một, hai hoặc
ba năm học Chỉ có quá trình này mới cung cấp được tương đối đầy đủ các kiếnthức cần thiết cho học sinh và phát hiện chính xác khả năng học tập của các em,
từ đó mới có thể thành lập các đội tuyển tham dự kỳ thi học sinh giỏi các cấpđạt kết quả như mong đợi
Các nội dung liên quan đến đệ quy, khử đệ quy, hay đệ quy quay lui khôngphải là nội dung quá mới trong việc giảng dạy, có thể dễ dàng tìm thấy các tàiliệu tham khảo liên quan, nhưng chưa có tài liệu nào đầy đủ, chi tiết, bài tập đadạng phong phú để các giáo viên cũng như các em học sinh có thể hiểu đượctoàn bộ kiến thức liên quan Phần bài tập đệ quy- khử đệ quy là phần bài tập khóthường chiếm một phần điểm trong các đề thi học sinh giỏi, cũng là phần có sốdạng bài và phương pháp giải phong phú Mặt khác các bài tập về đệ quy luôngây nhiều hứng thú và đôi khi sẽ gặp vấn đề khó giải quyết nếu như không hiểutường tận về nó
Với những lý do trên và qua thực tiễn giảng dạy nhiều năm, tôi đã tìm hiểunghiên cứu, tham khảo tài liệu và xây dựng nên đề tài: “ỨNG DỤNG THUẬTTOÁN ĐỆ QUY - KHỬ ĐỆ QUY TRONG GIẢNG DẠY BỒI DƯỠNG HỌCSINH GIỎI” nhằm giúp cho giáo viên bồi dưỡng học sinh giỏi cũng như giúpcác em học sinh giỏi có kinh nghiệm trong việc áp dụng thuật toán đệ quy để lậptrình cho các bài toán
2 MỤC ĐÍCH NGHIÊN CỨU
Nhằm giúp giáo viên và học sinh khi đứng trước một bài toán, xác địnhđược là bài toán đó có thể áp dụng được thuật toán đệ quy hay không? Và cáchgiải cụ thể như thế nào? Từ đó tôi đề ra mục đích, nhiệm vụ của việc thực hiện
đề tài như sau:
Trang 4- Giới thiệu khái niệm “thuật toán đệ quy”, giới thiệu khái niệm đệ quy,chương trình con đệ quy, các bước xây dựng chương trình con đệ quy và
cơ chế thực hiện thuật toán đệ quy và một số bài toán đệ quy điển hình
- Giới thiệu kỹ thuật khử đệ quy
3 ĐỐI TƯỢNG NGHIÊN CỨU
Sáng kiến “Ứng dụng thuật toán đệ quy – khử đệ quy trong giảng dạy bồi
dưỡng học sinh giỏi” có đối tượng nghiên cứu là các bài toán giải bằng thuật
toán đệ quy
Nội dung đề tài sử dụng ngôn ngữ lập trình C++ để giải quyết các bài toán
4 ĐỐI TƯỢNG KHẢO SÁT, THỰC NGHIỆM
Đề tài lấy đối tượng khảo sát, thực nghiệm là học sinh giỏi môn Tin họctrường THPT Hướng Hóa mà bản thân đã và đang trực tiếp giảng dạy
5 PHƯƠNG PHÁP NGHIÊN CỨU
Chủ yếu là nghiên cứu đề tài, tham khảo tài liệu, ý kiến đóng góp củađồng nghiệp và đặc biệt là đúc rút kinh nghiệm qua thực tiễn giảng dạy
6 PHẠM VI VÀ THỜI GIAN NGHIÊN CỨU
Trong khuôn khổ của một đề tài sáng kiến tôi chỉ khái quát nội dung lýthuyết và giải một số bài tập ứng dụng thuật giải đệ quy – khử đệ quy Đề tàiđược nghiên cứu trong quá trình học tập và giảng dạy, bồi dưỡng các đội tuyểnhọc sinh giỏi, giới hạn thời gian nghiên cứu trong 2 năm học: năm học 2018 -
2019 và 2019 - 2020
Trang 5PHẦN II NỘI DUNG
1 THUẬT TOÁN ĐỆ QUY
1.1 Khái niệm
Đệ quy là một khái niệm cơ bản trong toán học và khoa học máy tính Mộtđối tượng được gọi là đệ quy nếu nó hoặc một phần của nó được định nghĩathông qua khái niệm về chính nó
Ví dụ 1: Định nghĩa số tự nhiên bằng đệ quy như sau:
Theo đó, ta sẽ có 1 = 0 +1 là số tự nhiên, 2 = 1+1 cũng là số tự nhiên, …
Cứ như vậy ta sẽ định nghĩa được các số tự nhiên khác lớn hơn Do đó, số
tự nhiên là một khái niệm mang bản chất đệ quy
Ví dụ 2: Định nghĩa xâu kí tự bằng đệ quy như sau:
- Xâu rỗng là một xâu kí tự
- Một kí tự bất kỳ ghép với một xâu kí tự sẽ tạo thành một xâu mới.Thuật toán đệ quy đóng vai trò quan trọng trong việc giải quyết nhiều bàitoán Một thuật toán đệ quy là thuật toán có yêu cầu thực hiện lại chính thuậttoán đó với mức độ dữ liệu nhỏ hơn
Trong lĩnh vực lập trình, một chương trình máy tính được gọi là đệ quynếu trong chương trình đó có lời gọi chính nó Nhưng một chương trình khôngthể gọi mãi chính nó, vì như vậy sẽ tạo ra một vòng lặp vô hạn Do đó, mộtchương trình đệ quy trước khi gọi lại chính nó bao giờ cũng có một thao táckiểm tra điều kiện dừng Nếu điều kiện dừng thỏa mãn thì quá trình gọi đệ quy
sẽ chấm dứt
Nhìn chung, các chương trình đệ quy đều có những đặc điểm sau:
- Chương trình này có thể gọi lại chính nó, mục đích là giải quyếtvấn đề tương tự nhưng trong phạm vi nhỏ hơn
- Vấn đề nhỏ hơn này cho tới một lúc nào đó sẽ đơn giản tới mứcchương trình có thể tự giải quyết được mà không cần gọi tới chính
nó nữa, khi đó chương trình đệ quy kết thúc
Mô tả thuật toán đệ quy gồm 2 phần:
- Phần neo (phần cơ sở/phần dừng): mô tả trường hợp suy biến (cábiệt) của đối tượng qua một thao tác cụ thể xác định
- Phần quy nạp (phần đệ quy): mô tả đối tượng thông qua chính đốitượng đó một cách trực tiếp hoặc gián tiếp
Trang 6Hãy tính Fn với n cho trước.
Với bài toán này ta xác định :
- Phần quy nạp: khi n>1 thì Fn = Fn-1 +Fn-2
Ưu điểm của phương pháp mô tả đệ quy: có thể thực hiện một số lượnglớn các thao tác tính toán thông qua một thuật toán ngắn gọn, đơn giản (Mô tảmột bài toán lớn chỉ qua một số ít thao tác)
Hạn chế: Tốn bộ nhớ (nếu quản lý không tốt có thể gây tràn bộ nhớ) và thờigian thực hiện
Ví dụ 5 : Thuật toán đệ quy sử dụng ngay định nghĩa đệ quy của các sốFibonacci ở ví dụ 4 như sau:
1.2 Phân loại
Các chương trình đệ quy thường chia thành 2 loại:
- Đệ quy trực tiếp: là loại đệ quy mà đối tượng được mô tả trực tiếpqua nó: A mô tả qua A, B, C, …trong đó B, C, …không chứa A
Trang 7- Đệ quy gián tiếp: là loại đệ quy mà đối tượng được mô tả gián tiếpqua nó: A được mô tả qua A1, A2, …, An, trong đó có một Aiđược mô tả qua A.
Ví dụ 1: Chương trình tính ước số chung lớn nhất của hai số nguyên dựavào thuật toán Euclide sau là chương trình con đệ quy thuộc dạng đệ quy trựctiếp:
int UCLN(int m, int n)
1.3 Thuật toán đệ quy
Thuật toán đệ quy là thuật toán có chứa thao tác gọi lại chính nó Thuậttoán đệ quy cho phép mô tả một dãy lớn các thao tác bằng một số ít các thao táctrong đó có chứa thao tác gọi lại thuật toán Tức là nếu ta có lời giải S cho bàitoán P, ta lại sử dụng lời giải đó cho bài toán P’ giống P nhưng kích thước nhỏhơn thì lời giải S đó được gọi là lời giải đệ quy (thuật toán đệ quy)
Thực thi thuật toán đệ quy có thể dẫn tới một tiến trình gọi đệ quy khôngkết thúc khi đó không có khả năng gặp trường hợp neo (điều kiện dừng), vì vậy
ta cần quan tâm đến điều kiện dừng Để kiểm soát quá trình gọi đệ quy của thuậttoán đệ quy P người ta thường gắn thao tác gọi P với việc kiểm tra một điều kiện
B xác định và biến đổi qua mỗi lần gọi P và quá trình gọi P sẽ dừng khi B khôngcòn thỏa
Mô hình tổng quát của một thuật toán đệ quy được biểu diễn như sau:
P ¿ if (B) P[S,P]
hoặc P ¿ P[S, if (B)P]
Trang 8Thông thường với thuật toán đệ quy P, để đảm bảo P sẽ dừng sau n lần gọi
ta chọn B là (n>0) Khi đó, mô hình tổng quát của một thuật toán đệ quy có dạngnhư sau:
P(n) ¿ if (n>0) P[S, P(n-1)]
hoặc P(n) ¿ P[S, if (n>0) 1)]
P(n-Một số dạng thuật toán đệ quy đơn giản thường gặp:
- Đệ quy tuyến tính:
+ Một hàm được gọi là đệ quy tuyến tính nếu bên trong thânhàm có duy nhất một lời gọi hàm lại chính nó một cách trực tiếp(tường minh)
+ Là dạng đệ quy trực tiếp và đơn giản nhất có dạng sau:
S;
else {
thực hiên S*;
gọi P;
} } Với S, S* là các thao tác không đệ quy.
Ví dụ: Tính tổng các chữ số của số nguyên dương n
Ta phân tích bài toán này dưới dạng đệ quy như sau:
Gọi Tong(n) là tổng các chữ số của số nguyên dương n Ta có:
int TCS(int n)
{
if (n==0) return 0;
else
Trang 9return (n % 10)+ TCS(n / 10);
}
- Đệ quy nhị phân :
+ Một hàm được gọi là đệ quy nhị phân nếu bên trong thân hàm
có hai lời gọi hàm lại chính nó một cách trực tiếp có dạng sau:
S;
else {
thực hiên S*;
gọi P; gọi P;
}
}Với S, S* là các thao tác không đệ quy
Ví dụ: Hàm Fibo tính số hạng thứ n của dãy Fibonacci
Ta phân tích bài toán này dưới dạng đệ quy như sau:
Gọi Fibo(n) là số hạng thứ n của dãy Fibonacci Ta có:
else Fibo=(Fibo(n-1)+Fibo(n-2));
}Trong đó: P là Fibo(n), S là lệnh gán Fibo = 1, S* là lệnh rỗng Viết hàm bằng ngôn ngữ lập trình C++:
int F(int n) {
if (n==0) || (n==1) return 1;
else return F(n-1)+F(n-2);
}
- Đệ quy phi tuyến
Là dạng đệ quy trực tiếp mà lời gọi đệ quy được thực hiện bêntrong vòng lặp có dạng như sau:
S;
else
Trang 10for (i=chỉ số đầu;i<=chỉ số
Ví dụ: Cho dãy A(n) được xác định theo công thức sau:
for (i=5; i>=1;i ) s=s+A(n-i);
} A=s;}
Trong đó: P là A(n), S là lệnh gán s = n, S* là lệnh gán s = 0
int A(int n){
int S,i;
if (n<6) S=n;
else { S=0;
for (i=5;i>=1;i ) S= S + A (n-i);
} return S;
}
1.4 Chương trình con đệ quy
1.4.1 Hàm đệ quy
Trang 11Hàm đệ quy là hàm mà trong thân hàm có lời gọi lại chính nó.
1.5 Các bước xây dựng chương trình con đệ quy
Để xây dựng thuật toán giải một bài toán có tính đệ quy bằng phươngpháp đệ quy ta thực hiện 3 bước sau:
- Bước 1: Thông số hóa bài toán:
+ Tổng quát hóa bài toán cụ thể cần giải thành bài toán tổng quát
+ Tìm ra các thông số cho bài toán tổng quát (các thông số điều khiển: cácthông số mà độ lớn của chúng đặc trưng cho độ phức tạp của bài toán, vàgiảm đi một lần gọi đệ quy)
- Bước 2: Tìm các trường hợp neo cùng thuật toán giải tương ứng:
+ Đây là những trường hợp suy biến của bài toán tổng quát, là các trườnghợp tương ứng với giá trị biến của các biến điều khiển (trường hợp kíchthước bài toán nhỏ nhất) mà thuật toán giải không đệ quy
Trang 12- Bước 3: Tìm thuật toán giải trong trường hợp tổng quát bằng cách phân
rã bài toán theo kiểu đệ quy:
+ Tìm thuật toán giải bài toán trong trường hợp tổng quát bằng cách phân
nó thành các thành phần:
- Thuật toán không đệ quy
- Bài toán trên nhưng có kích thước nhỏ hơn
Ví dụ: Tính số hạng thứ n của dãy số Fibonacci được định nghĩa:
độ phức tạp của bài toán
Bước 2: Với n<2 thì trả về kết quả là Fibo(n) = 1 và dừng thuật toán Bước 3: Trong trường hợp tổng quát với n>2 thì:
Fibo(n) = Fibo(n-1)+Fibo(n-2)
1.6 Cơ chế thực hiện thuật toán đệ quy
Trạng thái của tiến trình xử lý một thuật toán ở một thời điểm được đặctrưng bởi các biến và lệnh cần thực hiện kế tiếp Với tiến trình xử lý một thuậttoán đệ quy ở từng thời điểm thực hiện, cần lưu trữ cả các trạng thái xử lý đangcòn dang dở
Đặc điểm của cơ chế thực hiện thuật toán đệ quy là việc thực thi lời gọi đệquy sinh ra lời gọi đệ quy mới cho đến khi gặp trường hợp neo (trường hợp suybiến) cho nên để thực thi thuật toán đệ quy cần có cơ chế lưu trữ thông tin thỏacác yêu cầu sau:
- Ở mỗi lần gọi phải lưu trữ thông tin trạng thái con dang dở của tiến trình
xử lý ở thời điểm gọi Số trạng thái này bằng số lần gọi chưa được hoàntất
- Khi thực hiện xong một lần gọi, cần khôi phục lại toàn bộ thông tin trạngthái trước khi gọi
- Lệnh gọi cuối cùng (ứng với trường hợp neo) sẽ được hoàn tất đầu tiên,thứ tự dãy các lệnh gọi được hoàn tất ngược với thứ tự gọi, tương ứng dãythông tin trạng thái được hồi phục theo thứ tự ngược với thứ tự lưu trữ
Trang 13Cấu trúc dữ liệu cho phép lưu trữ dãy thông tin thỏa 3 yêu cầu trên là câutrúc lưu trữ thỏa luật LIFO (Last In First Out) Một kiểu cấu trúc lưu trữ thườngđược sử dụng trong trường hợp này là cấu trúc ngăn xếp (Stack).
Ví dụ 1: Xét thuật toán đệ quy tính n giai thừa:
else GT=n*GT(n-1); }Giả sử với n = 3, khi đó thuật toán đệ quy tính n giai thừa sẽ được thựchiện như sau:
Các lời gọi đệ quy khi thực hiện hàm GT(3)
Qua hình 2, ta thấy khi thực hiện lời gọi GT(3) sẽ phát sinh lời gọi GT(2),đồng thời phải lưu trữ thông tin trạng thái xử lý còn dang dở (GT(3)=3*GT(2)),
để thực hiện lời gọi GT(2) thì lại phát sinh lời gọi GT(1), đồng thời vẫn phải lưutrữ thông tin trạng thái xử lý còn dang dở (GT(2)=2*GT(1)), cứ tiếp tục như vậycho đến khi gặp trường hợp neo GT(0)=1
Tiếp sau quá trình gọi là quá trình xử lý ngược được thực hiện như sau:
- Dùng GT(0) để tính GT(1) theo sơ đồ xử lý còn lưu trữ
- Dùng GT(1) để tính GT(2) theo sơ đồ xử lý còn lưu trữ
- Dùng GT(2) để tính GT(3) theo sơ đồ xử lý còn lưu trữ
Đồng thời với quá trình xử lý ngược là quá trình xóa bỏ các thông tin vềthuật toán xử lý trung gian (quá trình thu hồi bộ nhớ)
Ví dụ 2: Xét thuật toán tính tính số Fibonacci thứ n như sau:
else Fib= Fib(n-1)+Fib(n-2);
}Lời gọi Fibo(5) sẽ dẫn đến việc thực hiện theo sơ đồ sau:
GT(3)=3*GT(2)
GT(2)=2*GT(1)
GT(1)=1*GT(0)
GT(0)=1
Trang 14Các lời gọi đệ quy được thực hiện khi gọi hàm Fib(5)
Khi thực hiện lời gọi Fib(5) sẽ phát sinh lời gọi Fib(4) tiếp đến là lời gọiFib(3), đến khi thực hiện lời gọi Fib(4) lại dẫn đến lời gọi Fib(3) và Fib(2) và cứtiếp tục như vậy cho đến khi gặp trường hợp neo Fib(1) hoặc Fib(0) thì dừngviệc gọi đệ quy Tiếp sau quá trình gọi là quá trình xử lý ngược được thực hiện
để cho ra kết quả Fib(5)
Qua hai ví dụ minh họa về cơ chế hoạt động của thuật toán đệ quy, ta rút
ra được một nhận xét đó là mặc dù chương trình đệ quy ngắn gọn, thể hiện rõbản chất của vấn đề cần giải quyết nhưng hoạt động của chương trình đệ quykhông tường minh, làm người đọc khó hiểu, khó hình dung chương trình sẽ tínhtoán như thế nào trong lúc chạy chậm chương trình
1.7 Một số bài toán về đệ quy
1.7.1 Bài toán tháp Hà Nội
Có 3 cột A, B, C và cột A hiện có n đĩa, trong đó, đĩa nhỏ được nằm trênđĩa lớn Yêu cầu của bài toán là hãy chuyển n đĩa từ cột A sang cột C theo cách:
- Mỗi lần chỉ chuyển 1 đĩa
- Khi chuyển có thể dùng cột trung gian B
- Trong suốt quá trình chuyển các đĩa ở các cột thì đĩa có kích thướclớn hơn phải được đặt ở dưới
Fib(2)=Fib(1)+Fib(0) Fib(1)=1 Fib(1)=1 Fib(0)=1 Fib(1)=1 Fib(0)=1
Fib(0)=1 Fib(1)=1
Trang 15Hình 1 Bài toán Tháp Hà Nội
Phân tích bài toán
Xác định Input, Output:
- Input: số lượng đĩa n, 3 cột A, B, C
- Output: in ra màn hình quy trình để chuyển n đĩa từ cột A sang cột
C đúng quy định
Phân tích bài toán:
- Trường hợp n = 1: chuyển đĩa từ cột A sang cột C
- Trường hợp n = 2:
+ Chuyển đĩa thứ nhất từ cột A sang cột B
+ Chuyển đĩa thứ hai từ cột A sang cột C
+ Chuển đĩa thứ nhất từ cột B sang cột C
- Trường hợp n>2:
+ Chuyển (n-1) đĩa từ cột A sang cột B
+ Chuyển đĩa thứ n từ cột A sang cột C
+ Chuển (n-1) đĩa từ cột B sang cột C
Thông số hóa bài toán
Ta gọi thuật toán giải bài toán ở mức tổng quát là thủ tụcThapHN(n,A,B,C) chứa 4 thông số n, A, B, C Trong đó, n thuộc kiểu sốnguyên, A, B, C thuộc kiểu ký tự và trong 4 thông số thì thông số n là thông sốquyết định độ phức tạp của bài toán
Trường hợp neo và thuật toán tương ứng
Với n = 1, bài toán tổng quát suy biến thành bài toán đơn giảnThapHN(1,A,B,C) và trong trường hợp này thuật toán giải bài toánThapHN(1,A,B,C) chỉ thực hiện một thao tác cơ bản đó là chuyển 1 đĩa từ cột Asang cột C (sử dụng lệnh đưa thông báo bước chuyển ra màn hình)
Phân rã bài toán trong trường hợp tổng quát
Ta có thể phân rã bài toán ThapHN(k,A,B,C): chuyển k (k>1) đĩa từ cột Asang cột C lấy cột B làm cột trung gian ta thực hiện tuần tự 3 công việc sau:
Cột A Cột B Cột C
Trang 16- Chuyển (k-1) đĩa từ cột A sang cột B lấy cột C làm cột trung giankhi đó ta có thủ tục ThapHN(k-1,A,C,B) (bài toán ThapHN vớin=k-1, A=A, B=C, C=B).
- Chuyển 1 đĩa thứ k từ cột A sang cột C: đưa thông báo bướcchuyển ra màn hình
- Chuyển (k-1) đĩa từ cột B sang cột C lấy cột A làm cột trung giankhi đó ta có thủ tục ThapHN(k-1,B,A,C) (bài toán ThapHN vớin=k-1, A=B, B=A, C=C)
Vậy thuật toán trong trường hợp tổng quát (n>1) là:
Trang 171.7.2 Bài toán chia thưởng
Có m phần thưởng đem chia cho n học sinh giỏi đã được xếp hạng sao chohọc sinh giỏi hơn không ít phần thưởng hơn Có bao nhiêu cách khác nhau đểthực hiện cách chia?
Ta thấy ngay rằng việc tìm ra lời giải cho bài toán sẽ không dễ dàng nếu takhông tìm ra cách thích hợp để tiếp cận với nó Ta sẽ tìm thuật toán giải bài toánbằng phương pháp đệ quy
Phân tích bài toán
Xác định Input, Output của bài toán:
- Input: m, n
- Output: số cách chia
phần thưởng mà học sinh thứ i nhận được
Khi đó, các điều kiện ràng buộc lên cách chia là:
Thông số hóa bài toán
Ta sẽ giải bài toán ở mức độ tổng quát: Tìm số cách chia m vật (phầnthưởng) cho n đối tượng (học sinh) có thứ tự
Gọi Chiathuong(m,n) là số cách chia m vật (phần thưởng) cho n đối tượng(học sinh) Chiathuong là hàm của hai biến m, n
Trường hợp neo và thuật toán tương ứng
Khi m = 0: có duy nhất một cách chia, đó là mọi học sinh đều nhận được 0phần thưởng Khi đó, ChiaThuong(0,n) = 1