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

Các nội dung liên quan đến đệ quy, khử đệ quy, hay đệ quy quay lui không phả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ài liệ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 đa dạng phong phú để các giáo viên cũng như các em học sinh có thể hiểu được toàn bộ kiến thức liên quan.
SỞ GIÁO DỤC ĐÀO TẠO QUẢNG TRỊ  
TRƯỜNG THPT HƯỚNG HÓA  
SÁNG KIẾN KINH NGHIỆM  
Tên đề tài:  
ỨNG DỤNG THUẬT TOÁN  
ĐỆ QUY - KHỬ ĐỆ QUY TRONG GIẢNG  
DẠY BỒI DƯỠNG HỌC SINH GIỎI  
HỌ VÀ TÊN GIÁO VIÊN: NGUYỄN TIẾN LONG  
TỔ TIN HỌC  
TRƯỜNG THPT HƯỚNG HÓA  
Hướng Hóa, Tháng 7 năm 2020  
MỤC LỤC  
2
 
PHẦ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 một vấn đề cấp thiết hiện  
nay đượ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 một nhiệm vụ quan trọng không thể thiếu của ngành  
giáo dục nói chung và của các trường nói riêng đặc biệt đối với mỗi một giáo  
viên tham gia bồi dưỡng thì đây một nhiệm vụ không dễ dàng.  
Bồi dưỡng học sinh giỏi 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ến thứ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 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ông  
phải nội dung quá mới trong việc giảng dạy, thể dễ dàng tìm thấy các tài liệ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 đa dạng  
phong phú để các giáo viên cũng như các em học sinh có thể hiểu được toà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 phần số dạng bài  
phương pháp giải phong phú. Mặt khác các bài tập về đệ quy luôn gâ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ểu tườ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ểu  
nghiên cứu, tham khảo tài liệu và xây dựng nên đề tài: “ỨNG DỤNG THUẬT  
TOÁN ĐỆ QUY - KHỬ ĐỆ QUY TRONG GIẢNG DẠY BỒI DƯỠNG HỌC  
SINH GIỎI” nhằm giúp cho giáo viên bồi dưỡng học sinh giỏi cũng như giúp các  
em học sinh giỏi có kinh nghiệm trong việc áp dụng thuật toán đệ quy để lập trì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 đó thể áp dụng được thuật toán đệ quy hay không? Và cách  
giả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:  
3
   
- 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” đố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 học sinh giỏi môn Tin học  
trường THPT Hướng Hóa mà bản thân đã đ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 đặc biệt đú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 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 giảng dạy, bồi dưỡng các đội tuyển họ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.  
4
       
PHẦ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 đệ quy nếu hoặc một phần của được định nghĩa thông  
qua khái niệm về chính nó.  
dụ 1: Định nghĩa số tự nhiên bằng đệ quy như sau:  
- 0 số tự nhiên.  
- Nếu k là số tự nhiên thì k+1 cũng số tự nhiên.  
Theo đó, ta sẽ có 1 = 0 +1 là số tự nhiên, 2 = 1+1 cũng 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.  
dụ 2: Định nghĩa xâu kí tự bằng đquy như sau:  
- Xâu rỗng một xâu kí tự.  
- Một 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ài  
toá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ật toá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 đệ quy nếu  
trong chương trình đó lời gọi chính nó. Nhưng một chương trình không thể gọi  
mãi chính nó, vì như vậy sẽ tạo ra một vòng lặp hạn. Do đó, một chương trình  
đệ quy trước khi gọi lại chính nó bao giờ cũng một thao tác kiể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 những đặc điểm sau:  
- Chương trình này có thể gọi lại chính nó, mục đích giải quyết vấ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ức  
chương trình có thể tự giải quyết được mà không cần gọi tới chính  
nữa, khi đó chương trình đệ quy kết thúc.  
tả thuật toán đệ quy gồm 2 phần:  
- Phần neo (phần cơ sở/phần dừng): 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 đối  
tượng đó một cách trực tiếp hoặc gián tiếp.  
dụ 3: Xét bài toán tính n! (Với n là một số nguyên bất kỳ).  
5
     
Ta có: n! = n(n-1)!  
Do đó ta có thể tả bài toán dưới dạng đquy như sau:  
1
khi n 0  
khi n 0  
n!   
n(n -1)!  
Với bài toán này ta xác định :  
- Phần neo : khi n = 0 thì n! = 1.  
- Phần quy nạp : Khi n>0 thì n ! = n(n-1) !  
dụ 4: Định nghĩa các số Fibonacci như sau :  
1
khin 0n 1  
khin 1  
F   
n
F F  
n-1  
n-2  
Hãy tính Fn với n cho trước.  
Với bài toán này ta xác định :  
- Phần neo: khi n = 0 hoặc n = 1 thì Fn = 1.  
- 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ượng lớ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 thể gây tràn bộ nhớ) thời  
gian thực hiện.  
dụ 5 : Thuật toán đệ quy sử dụng ngay định nghĩa đệ quy của các số  
Fibonacci dụ 4 như sau:  
int F(int n)  
{
if (n<2) return 1;  
else return F(n-1) + F(n-2);  
}
Qua đó, ta thấy thuật toán đệ quy trên rất ngắn gọn, đơn giản, dễ hiểu và  
nêu bật lên bản chất của vấn đề nhưng do việc gọi đệ quy bài toán trên tạo ra  
những tính toán thừa nhiều lần, không cần thiết gây lãng phí bộ nhớ thời gian  
thực hiện.  
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: loại đệ quy mà đối tượng được tả trực tiếp  
qua nó: A mô tả qua A, B, C, …trong đó B, C, …không chứa A.  
6
 
- Đệ quy gián tiếp: loại đệ quy mà đối tượng được tả gián tiếp  
qua nó: A được tả qua A1, A2, …, An, trong đó một Ai được  
tả qua A.  
dụ 1: Chương trình tính ước số chung lớn nhất của hai số nguyên dựa  
vào thuật toán Euclide sau là chương trình con đệ quy thuộc dạng đệ quy trực tiếp:  
int UCLN(int m, int n)  
{
if (n==0) return m;  
else  
return UCLN (n, m % n);  
}
dụ 2: Mô tả đệ quy hai dãy số {Xn} và {Yn} sau thuộc dạng đệ quy gián  
tiếp:  
X0 = 1; Xn = Xn-1 + Yn-1;  
Y0 = 1; Yn = n2Xn-1 + Yn-1;  
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ật toá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ác trong  
đó chứa thao tác gọi lại thuật toán. Tức nếu ta có lời giải S cho bài toá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ờ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ông  
kết thúc khi đó không có khả năng gặp trường hợp neo (điều kiện dừng), 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ật  
toá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 biến đổi qua mỗi lần gọi P và quá trình gọi P sẽ dừng khi B không  
cò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]  
P[S, if (B) P]  
hoặc P  
Thô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ạng  
như sau:  
P(n)  
if (n>0) P[S, P(n-1)]  
P[S, if (n>0) P(n-1)]  
hoặc P(n)  
7
 
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 đệ quy tuyến tính nếu bên trong thân hà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 đơn giản nhất dạng sau:  
P
{if(điều kiện dừng)  
thực hiện S;  
else  
{
thực hiên S*;  
gọi P;  
}
}
Với S, S* là các thao tác không đệ quy.  
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ó:  
Tong(n)  
{
if(n=0) Tong = 0;  
else  
Tong=Tong(n / 10) +(n % 10);  
}
Trong đó: P là Tong(n), S là lệnh gán Tong = 0, S* là lệnh rỗng.  
Viết hàm bằng ngôn ngữ C++:  
int TCS(int n)  
{
if (n==0) return 0;  
else  
return (n % 10)+ TCS(n / 10);  
}
- Đệ quy nhị phân :  
+ Một hàm được gọi đệ 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 dạng sau:  
P
{if(điều kiện dừng)  
thực hiện S;  
else  
8
{
thực hiên S*;  
gọi P; gọi P;  
}
}
Với S, S* là các thao tác không đệ quy.  
dụ: Hàm Fibo tính số hạng thn 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 thn của dãy Fibonacci. Ta có:  
Fibo(n) {if((n==0)||(n==1)) Fibo=1;  
else  
Fibo=(Fibo(n-1)+Fibo(n-2));  
}
Trong đó: P là Fibo(n), S 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  
dạng đệ quy trực tiếp lời gọi đệ quy được thực hiện bên  
trong vòng lặp dạng như sau:  
P
{if(điều kiện dừng)  
thực hiện S;  
else  
for  
(i=chỉ  
số  
đầu;i<=chỉ số  
cuối;i++)  
{
thực hiên S*;  
gọi P;  
}
}
dụ: Cho dãy A(n) được xác định theo công thức sau:  
9
n
, n 6  
A(n)   
A(n - 5) A(n - 4) A(n - 3) A(n - 2) A(n -1) , n 6  
Gọi A(n) là tổng các số được xác định theo công thức trên. Ta có:  
A(n) {if(n<6) s=n;  
else  
{
s=0;  
for (i=5; i>=1;i--)  
s=s+A(n-i);  
}
A=s;}  
Trong đó: P là A(n), S lệnh gán s = n, S* 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  
Hàm đệ quy là hàm mà trong thân hàm có lời gọi lại chính nó.  
dụ: Hàm đệ quy tính n!  
double GT(int n)  
{
if (n==0)  
else  
return 1;  
return n*GT(n-1);  
1.4.2. Thủ tục đquy  
}
10  
     
Thủ tục đệ quy là thủ tục chứa lệnh gọi đến chính nó. Thủ tục đệ quy  
thường được sử dụng để tả các thao tác trên cấu trúc dữ liệu có tính đệ quy.  
dụ: Thủ tục đệ quy in đảo ngược một số nguyên dương n cho trước như  
sau:  
void IDN(int n)  
{
if (n<10) cout<<n;  
else  
{
Cout<<n % 10;  
IDN(n / 10);  
}
}
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ương phá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ác  
thông số độ 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 những trường hợp suy biến của bài toán tổng quát, là các trường  
hợ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ích  
thước bài toán nhỏ nhất) thuật toán giải không đệ quy.  
- 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  
dụ: Tính số hạng thứ n của dãy số Fibonacci được định nghĩa:  
1
khin 0n 1  
khin 1  
F   
n
F F  
n-1  
n-2  
11  
 

Tải về để xem bản đầy đủ

docx 33 trang minhvan 30/07/2024 1160
Bạn đang xem 11 trang mẫu của tài liệu "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", để tải tài liệu gốc về máy hãy click vào nút Download ở trên.

File đính kèm:

  • docxskkn_ung_dung_thuat_toan_de_quy_khu_de_quy_trong_giang_day_b.docx