Từ mục đích nhằm nâng cao kết quả ôn luyện thi học sinh giỏi, đồng thời giải quyết các khó khăn trong quá trình ôn luyện tôi đã chọn đề tài “Một số kinh nghiệm nâng cao hiệu quả ôn thi h
Trang 1MỤC LỤC
A PHẦN MỞ ĐẦU 2
I Lý do chọn đề tài: 2
II Mục đích nghiên cứu: 3
III Đối tượng và phạm vi nghiên cứu: 3
IV Nhiệm vụ nghiên cứu: 3
V Phương pháp nghiên cứu: 4
B PHẦN NỘI DUNG 5
I Cơ sở lý luận của đề tài: 5
1 Các khái niệm: 5
a) Khái niệm Đệ quy: 5
b) Đặc điểm của chương trình con đệ quy: 6
c) Phân loại đệ quy: Gồm 2 loại: 6
2 Nguyên tắc hoạt động của giải thuật đệ quy: 7
a) Khái niệm stack: 7
b) Nguyên tắc hoạt động của giải thuật đệ quy ứng dụng Stack: .7
c) Ưu điểm và nhược điểm của giải thuật đệ quy: 8
3 Đệ quy quay lui: 8
a) Khái niệm đệ quy quay lui: 8
b) Giải thuật tổng quát của đệ quy quay lui: 9
c) Nét đặc trưng của phương pháp đệ quy quay lui: 10
d) Ưu và nhược điểm: 11
4 Phương pháp khử đệ quy: 11
5 Sự khác nhau giữa đệ quy và lặp: 12
II GIẢI PHÁP NÂNG CAO HIỆU QUẢ ÔN LUYỆN THI HSG THÔNG QUA CÁC BÀI TẬP VÍ DỤ ĐỆ QUY, ĐỆ QUY QUAY LUI VÀ KHỬ ĐỆ QUY .13
1 Các bài tập cơ bản về đệ quy và không đệ quy: 13
2 Các bài tập đệ quy và đệ quy quay lui: 14
3 Kết quả đạt được: 19
C KẾT LUẬN VÀ KIẾN NGHỊ 20
Trang 2A PHẦN MỞ ĐẦU
I Lý do chọn đề tài:
Như chúng ta đã biết, việc đào tạo bồi dưỡng học sinh giỏi thật sự là công việc rất khókhăn, đòi hỏi nhiều công sức của giáo viên và học sinh Trong một những năm gần đây,trong các kỳ thi chọn học sinh giỏi các môn văn hóa cấp tỉnh, đội tuyển học sinh giỏitrường THPT Nông Cống 4 đã đạt được rất nhiều thành tích cao, cụ thể xếp hạng trong cácnăm học từ 2015 trở về trước đứng dưới thứ 40 của tỉnh Trong năm học 2016-2017 vượtlên thứ 28 và năm học 2017-2018 giữ nguyên thứ hạng Điều này được sự góp phần côngsức rất lớn lao của đội ngũ các thầy cô trực tiếp giảng dạy, sự vươn lên mọi khó khăn từ các
em học sinh đã góp phần vào kết quả chung của nhà trường, trong đó có sự đóng góp thànhtích của bộ môn Tin học Vì vậy bản thân tôi luôn cố gắng phấn đấu để cùng bắt nhịp vớiđội tuyển các môn trong nhà trường
Tuy nhiên, sau nhiều năm đào tạo, tôi nhận thấy thực trạng của công tác ôn thi họcsinh giỏi của bộ môn Tin học đã bộc lộ những khó khăn và thuận lợi sau:
+ Khó khăn:
- Tìm kiếm và xây dựng nguồn nhân lực rất khó khăn, nhất là trong điều kiện mà bắtđầu từ năm học 2017-2018 khối học sinh 12 không tham gia dự thi, điều này đã làm cholực lượng học sinh có chất lượng khối 11 khó có thể thi Tin học (vì các em học môn tựnhiên đã thi môn khác)
- Học sinh luôn đứng trước sự lựa chọn giữa học chuyên sâu để thi học sinh giỏi vàhọc để thi ĐH-CĐ, dẫn đến việc thi môn trái với môn thi ĐH-CĐ là không nằm trong sựlựa chọn của các em
- Một số học sinh tham gia học bồi dưỡng nhưng chưa thật cố gắng nên kết quả thihọc sinh giỏi chưa cao
- Bản thân chưa đủ điều kiện, thời gian để tự bồi dưỡng, nghiên cứu nhằm nâng caochất lượng dạy học, trong khi đó áp lực công việc ôn luyện không hề nhỏ
- Cơ sở vật chất, trang thiết bị, tài liệu dạy học phục vụ cho công tác bồi dưỡng HSG
Trang 3- Đặc biệt khối kiến thức thi học sinh giỏi rất rộng, trong khi đó các em chỉ được ônluyện từ khi làm quen với ngôn ngữ lập trình cho đến khi đi thi chỉ được khoảng 2-3 tháng.
Trước những thuận lợi và khó khăn như trên và qua nhiều năm tham gia ôn luyện thi
học sinh giỏi tôi đã rút ra nhiều bài học kinh nghiệm, trong đó có việc giúp học sinh đạt kếtquả cao nhất của những bài thi khó, đó là các bài cuối cùng của đề thi Những dạng bài này thường dùng giải thuật đệ quy để giải
Như ta đã biết, các phép lặp là một trong những kỹ thuật được dùng để giải các bàitoán bằng cách thực hiện liên tiếp một số các câu lệnh trong vòng lặp cho tới khi một điềukiện nào đó được thỏa mãn Một kỹ thuật lập trình được sử dụng để thay thế cho các phéplặp đó là kỹ thuật đệ quy Mặt khác, trong thực tế có rất nhiều bài toán đòi hỏi sự lặp đi lặplại một cách phức tạp Và đệ quy cung cấp cho ta cơ chế giải quyết bài toán phức tạp mộtcách đơn giản Hơn nữa, đệ quy còn thích hợp để giải quyết các bài toán có bản chất đệ quy
và rất nhiều bài toán cho đến nay vẫn chưa có lời giải phi đệ quy
Từ mục đích nhằm nâng cao kết quả ôn luyện thi học sinh giỏi, đồng thời giải quyết
các khó khăn trong quá trình ôn luyện tôi đã chọn đề tài “Một số kinh nghiệm nâng cao
hiệu quả ôn thi học sinh giỏi thông qua các bài toán đệ quy, khử đệ quy và đệ quy quay lui” làm đề tài sáng kiến kinh nghiệm của mình.
II Mục đích nghiên cứu:
- Nhằm nâng cao hiệu quả ôn luyện thi học sinh giỏi
- Gây hứng thú đối với học sinh tham gia thi học sinh giỏi môn tin học thông qua việcsinh test cho mỗi bài tập để chấm điểm, phân tích dữ liệu xử lý
- Khắc phục các khó khăn khi giải các bài toán khó trong đề thi
- Nâng cao năng lực của bản thân cũng như các đối tượng có sử dụng phương pháp đệquy để giải bài tập
III Đối tượng và phạm vi nghiên cứu:
1 Đối tượng:
Đối tượng nghiên cứu của đề tài là tìm hiểu về lý thuyết đệ quy, xây dựng các phươngpháp giải đệ quy thông qua các bài tập từ đơn giản đến phức tạp
2 Phạm vi:
- Thực hiện các giải các bài toán bằng phương pháp đệ quy
IV Nhiệm vụ nghiên cứu:
- Nghiên cứu những cơ sở về lý luận về lý thuyết đệ quy, tìm hiểu các ứng dụng về đệquy
- Nghiên cứu và phân tích các đặc điểm, ưu - nhược điểm khi sử dụng giải toán bằngphương pháp đệ quy
Trang 4- Nghiên cứu thực tiễn dạy học trong quá trình hướng dẫn học sinh giải toán bằng đệquy
V Phương pháp nghiên cứu:
1 Lý thuyết
- Tham khảo tài liệu sách, báo, mạng Internet có liên quan trực tiếp đến đề tài
2 Thực tiễn
Trong quá trình dạy học ôn luyện thi học sinh giỏi lần lượt thực hiện các bước sau:
+ Tìm hiểu lý thuyết, các bài toán nào ứng dụng bằng phương pháp đệ quy
+ Xây dựng các bài toán đơn giản giải bằng phương pháp đệ quy để học sinh tiếp cậntừng bước các dạng toán được áp dụng
+ Thực hiện giải các bài toán khó trong đề thi HSG tỉnh các năm và đề thi các tỉnhkhác
+ Tạo các TEST cho mỗi bài tập từ bài dễ đến khó nhằm tạo hứng thú học tập cho họcsinh, đồng thời đánh giá được độ phức tạp của thuật toán, đánh giá được năng lực phân tíchthuật toán để viết được một chương trình tối ưu nhất
Trang 5B PHẦN NỘI DUNG
I Cơ sở lý luận của đề tài:
1 Các khái niệm:
a) Khái niệm Đệ quy:
Nếu thuật toán của một bài toán A được thực hiện bằng thuật toán của bài toán A’ códạng giống như A, thì đó là thuật toán đệ quy (A’ nhỏ hơn A) Hay có thể nói cách khác đólà: Từ bài toán A chúng ta có thể chia nhỏ bài toán đó thành các bài toán con cùng kiểu sovới bài toán gốc ban đầu, cứ chia nhỏ như vậy cho đến khi nào gặp đến bài toán cơ bảnnhất mà chúng ta có thể xử lý được (trường hợp suy biến) thì thao tác dừng
Như vậy trong quá trình lập trình, việc xây dựng các chương trình con (thủ tục/hàm)nếu sử dụng phương pháp đệ quy sẽ được hiểu như sau: Chương trình con đệ quy làchương trình con mà trong đó có lời gọi tới chính chương trình con đó
+ Các bài toán có thể dùng đệ quy:
Bài toán dễ dàng giải quyết trong một số trường hợp riêng ứng với các giá trị đặc biệtcủa tham số Ta gọi đây là trường hợp suy biến Trong trường hợp tổng quát, bài toán có thểquy về một bài toán cùng dạng nhưng giá trị tham số thì bị thay đổi Và sau một số hữu hạnbước biến đổi Ðệ Quy sẽ dẫn đến trường hợp suy biến
Ví dụ:
1 Định nghĩa về giai thừa n!:
0! = 1
Nếu n>0 thì n!=n*(n-1)!
+ Code mô tả như sau:
Function gt(n: Word): Longint;
n là một số tự nhiên khi n-1 là 1 số tự nhiên
3 Định nghĩa dãy Fibonacci f(n):
= 5 x (4 x (3 x (2 x 1)))
= 120
Trang 6Từ các ví dụ trên chúng ta nhận thấy chúng đều có chung cấu trúc dạng hàm gọi cáchàm khác dưới dạng mô hình phân cấp Tuy nhiên đối với một số bài toán, việc dùng hàmgọi ngay chính nó rất hữu dụng Có thể định nghĩa hàm đệ quy là hàm sẽ gọi đến chính nótrực tiếp hay gián tiếp thông qua các hàm khác Vấn đề đệ quy là một vấn đề rất phức tạp,gây khó hiểu cho người học, đặc biệt là những học sinh mới học lập trình có tư duy thuậttoán chưa sâu Do đó trong đề tài sẽ giới thiệu, phân tích, mô phỏng các bài toán đệ quy từđơn giản đến phức tạp để các em dễ dàng tiếp cận.
Trước tiên ta xem xét khái niệm đệ quy, sau đó kiểm tra trên một vài chương trình cóchứa các hàm đệ quy Cách tiến hành giải một bài toán đệ quy nhìn chung có những điểmchung sau
Trước tiên gọi hàm đệ quy để giải bài toán, hàm đệ quy thực ra chỉ biết cách giải bàitoán trong trường hợp đơn giản nhất (hay còn gọi là trường hợp cơ sở) Nếu hàm đệ quyđược gọi trong trường hợp cơ sở, hàm chỉ cần đơn giản trả lại kết quả Nếu hàm được gọitrong các trường hợp phức tạp hơn, hàm đệ quy sẽ chia công việc cần giải quyết thành haiphần Một phần hàm biết cách giải quyết như thế nào, còn phần kia vẫn không biết cáchgiải quyết như thế nào tuy nhiên để được gọi là có khả năng đệ quy, phần sau phải giốngvới bài toán ban đầu nhưng đơn giản hơn hay nhỏ hơn bài toán ban đầu Bởi vì bài toánmới giống với bài toán ban đầu nên hàm sẽ thực hiện gọi chính nó để giải quyết công việcđơn giản hơn này - đây chính là lời gọi đệ quy hay còn gọi là một bước đệ quy Ðể đảm bảoviệc đệ quy có kết thúc, mỗi một lần gọi đệ quy thì bài toán phải đảm bảo đơn giản hơn vàcác bước đệ quy này còn thực hiện tiếp cho đến khi nào bài toán đơn giản dần, đơn giản tớimức trở thành trường hợp cơ sở Có thể nhận thấy hàm đệ quy xử lý trường hợp cơ sở đểtrả lại kết quả tính được cho các hàm mức phức tạp hơn, rồi đến lượt các hàm này lại tínhtrả lại kết quả cho các hàm phức tạp hơn nữa cứ như vậy cho đến lời gọi hàm ban đầu
b) Đặc điểm của chương trình con đệ quy:
- Trong chương trình con đệ quy có lời gọi đến chính chương trình con đó
- Mỗi lần gọi lại chương trình con đó thì kích thước bài toán đã thu nhỏ hơn trước
- Có một trường hợp đặc biệt: đó là trường hợp suy biến Đây chính là trường hợpgiúp chúng ta kết thúc việc chia nhỏ chương trình để từ đây truy hồi công thức lấy kết quả
c) Phân loại đệ quy: Gồm 2 loại:
Đệ quy trực tiếp và Đệ quy gián tiếp
Trang 7+ Đệ quy trực tiếp: Là loại đệ quy mà đối tượng được mô tả trực tiếp qua nó:
Ví dụ 1: A mô tả qua A, B, C… Trong đó B, C không chứa A
Ví dụ 2: Mô tả đệ quy cây gia phả: Gia phả của một người bao gồm người đó và giaphả của người ch và gia phả của người mẹ
Ví dụ 3: Mô tả đệ quy về thi chọn hoa hậu:
- Chọn hoa hậu của từng khu vực
- Chọn hoa hậu của các hoa hậu
+ Đệ quy gián tiếp: Là loại đệ quy mà đối tượng được mô tả gián tiếp qua nó:
Ví dụ: A mô tả qua B, C, D Trong đó: B được mô tả qua A và E, còn C và D khôngchứa A
2 Nguyên tắc hoạt động của giải thuật đệ quy:
Trong quá trình thực hiện lời gọi đệ quy, các tham số, biến cục bộ hay địa chỉ sẽ được lưu tạm thời trong bộ nhớ Các giá trị trên sẽ được lấy ra để giải quyết khi xảy ra trường hợp suy biến, giá trị vào sau cùng sẽ được lấy ra đầu tiên Chính vì vậy quá trình lưu và xử
lý dữ liệu sẽ thực hiện theo mô hình stack.
a) Khái niệm stack:
Stack (ngăn xếp) là một danh sách mà việc thêm và xóa các phần tử chỉ diễn ra ở mộtđầu của danh sách Stack được thiết kế theo nguyên lý Last-In-First-Out (LIFO), nghĩa
là vào sau, ra trước Phần tử nào được thêm vào sau cùng sẽ là phần tử được lấy ra đầu tiên
Ví dụ: - Xếp đĩa CD chồng lên nhau, đĩa CD cuối cùng đưa vào sẽ là đĩa CD đầu tiên lấy ra
+ Đặc điểm của Stack
Mọi phần tử trong Stack phải cùng kiểu dữ liệu và có thể là bất kỳ kiểu dữ liệu nào, kể
cả struct hay object Một Stack gồm có phần đáy (bottom) và phần đỉnh (top) Phần tử nằm
ở đỉnh Stack được gọi là Top Item Mọi thao tác thêm, xóa phần tử đều diễn ra ở đỉnh
Stack
b) Nguyên tắc hoạt động của giải thuật đệ quy ứng dụng Stack:
Hình ảnh minh họa hoạt động
của stack
Trang 8- Khi thực hiện một giải thuật đệ quy thì các bước của giải thuật đệ quy sẽ lần lượtđược thực hiện tuần tự
- Khi gặp lời gọi đệ quy thì trước khi thực hiện lời gọi đệ quy, đoạn mã lệnh chưađược thực hiện xong cùng với các đối tượng dữ liệu liên quan tại thời điểm này sẽ được lưuvào stack
- Đến lúc nào đó không thể thực hiện lời gọi đệ quy nữa (trường hợp suy biến) thì cácđối tượng được lưu trong stack sẽ lần lượt được lấy ra để xử lý
Ví dụ: Giải thuật đệ quy cho bài toán tính N!
Giả sử N = 3, quy trình thực hiện như sau:
- Thực hiện lời gọi hàm: giaithua := gt(3); máy tính sẽ ghi nhớ là: gt(3) := 3 * gt(2);
và đi tính gt(2)
- Tiếp tục máy lại ghi nhớ: gt(2):= 2*gt(1); và đi tính gt(1)
- Theo định nghĩa của hàm thì khi gt(1):= 1; máy sẽ quay ngược lại: gt(2):= 2 * 1; vàcho kết quả là 2
- Tiếp tục: gt(3) := 3 * 2; cho kết quả là 6
Như vậy kết quả cuối cùng trả về là 6 Ta có: 3! = 6
Mặc dù ứng dụng giải toán bằng phương pháp đệ quy kể cả toán học lẫn các ứng dụngtrong thực tiễn vẫn còn tồn tại một số ưu – nhược điểm, cụ thể như sau:
c) Ưu điểm và nhược điểm của giải thuật đệ quy:
cũ vẫn duy trì chưa được giải phóng
- Tốc độ thực hiện chương trình chậm hơn khi không dụng đệ quy
- Do đệ quy lưu trữ các dữ liệu trung gian vào Stack nên nếu lưu nhiều bộ dữ liệu lớntrên Stack có thể gây ra hiện tượng tràn Stack
Trang 9a) Khái niệm đệ quy quay lui:
Quay lui (Backtracking) là phương pháp tìm kiếm lời giải cho các bài toán mà nghiệm của nó là một hay một tập cấu hìn thỏa mãn đồng thời 2 tính chất P và Q, trong đó:
Ví dụ 1:
Giả sử cấu hình liệt kê có dạng a[1 n], khi đó thuật toán quay lui thực hiện qua các bước1) Xét tất cả các giá trị a[1] có thể nhận, thử a[1] nhận lần lượt các giá trị đó Với mỗigiá trị thử gán cho a[1] ta sẽ:
2) Xét tất cả các giá trị a[2] có thể nhận, thử cho a[2] nhận lần lượt các giá trị đó Vớimỗi giá trị thử gán cho a[2] lại xét tiếp các khả năng chọn a[3] cứ tiếp tục như vậy chođến bước:
b) Giải thuật tổng quát của đệ quy quay lui:
Procedure TRY(i: integer);
Trang 10- Thủ tục bắt đầu hoạt động với Try(1).
- Phân tích giải thuật:
•Nếu một khả năng j nào đó phù hợp cho xi thì xác định xi theo khả năng j Thườngphải thêm thao tác ghi nhận trạng thái mới của bài toán để hỗ trợ cho bước quay lui.Nếu i=n thì ta có được một lời giải, ngược lại thì tiến hành bước i+1 để xác định xi+1
•Nếu không có khả năng nào chấp nhận được cho xi thì ta lùi lại bước trước (i-1) đểxác định lại thành phần xi-1
•Nếu một khả năng j nào đó phù hợp cho xi thì xác định xi theo khả năng j Thườngphải thêm thao tác ghi nhận trạng thái mới của bài toán để hỗ trợ cho bước quay lui.Nếu i=n thì ta có được một lời giải, ngược lại thì tiến hành bước i+1 để xác định xi+1
•Nếu không có khả năng nào chấp nhận được cho xi thì ta lùi lại bước trước (i-1) đểxác định lại thành phần xi-1
- Về bản chất của đệ quy quay lui là quá trình tìm kiếm theo chiều sâu, chúng ta có thể mô
tả quá trình tìm kiếm theo sơ đồ cây nhị phân như sau:
Áp dụng: Với bài toán liệt kê tất cả các hoán vị n số tự nhiên nguyên dương đầu tiên theo
thứ tự tăng dần của từ điển: Cho N = 3:
- Try(k): Tìm thành phần thứ k của hoán vị
- Duyệt tập các phương án chọn: {1, 2, …, N}
- Chấp nhận được k: Khi k chưa được chọn trước đó
- Thực hiện bước chọn: Đánh dấu k đã chọn
- Thành công: Khi chọn được thành phần thứ k = N
Try(1)
Try(2 )
Try(2)
Trang 11- Hủy chọn: Đánh dấu k chưa được chọn.
c) Nét đặc trưng của phương pháp đệ quy quay lui:
• Các bước hướng tới lời giải cuối cùng của bài toán hoàn toàn được làm thử
d) Ưu và nhược điểm:
+ Ưu điểm: Việc quay lui là thử tất cả các tổ hợp để tìm được một lời giải Thế mạnh của
phương pháp này là nhiều cài đặt tránh được việc phải thử nhiều trường hợp chưa hoànchỉnh, nhờ đó giảm thời gian chạy
+ Nhược điểm: Trong trường hợp xấu nhất độ phức tạp của quay lui vẫn là cấp số mũ Vì
nó mắc phải các nhược điểm sau:
o Rơi vào tình trạng "thrashing – thất bại": quá trình tìm kiếm cứ gặp phải bế tắc vớicùng một nguyên nhân
o Thực hiện các công việc dư thừa: Mỗi lần chúng ta quay lui, chúng ta cần phải đánhgiá lại lời giải trong khi đôi lúc điều đó không cần thiết
o Không sớm phát hiện được các khả năng bị bế tắc trong tương lai Quay lui chuẩn,không có cơ chế nhìn về tương lai để nhận biết đc nhánh tìm kiếm sẽ đi vào bế tắc
4 Phương pháp khử đệ quy:
a) Khử đệ quy là gì?
Khử đệ quy ở đây là biến một thủ tục đệ quy thành một thủ tục chỉ chứa vòng lặp màkhông ảnh hưởng gì đến các yếu tố khác, chứ không phải là thay đổi thuật toán
b) Tại sao phải khử đệ quy ?
Khử đệ quy là một việc làm phức tạp và khó khăn Ở hàm n! ta có thể dùng một thuậttoán không đệ quy, nhưng trong một số bài toán, đệ quy là bắt buộc Tuy nhiên đôi khi,
sự hạn hẹp của bộ nhớ dành cho chương trình; hoặc ngôn ngữ máy không có đệ quy, vìvậy các trình biên dịch đều phải có nhiệm vụ khử đệ quy
c) Khử để quy như thế nào ?
Khử đệ quy thực chất là chúng ta phải làm công việc của một trình biên dịch đối vớimột thủ tục, đó là: Đặt tất cả các giá trị của các biến cục bộ và địa chỉ của chỉ thị kế tiếpvào Stack, quy định các giá trị tham số cho thủ tục và chuyển tới vị trí bắt đầu thủ tục, thựchiện lần lượt từng câu lệnh Sau khi thủ tục hoàn tất thì nó phải lấy ra khỏi ngăn xếp địa chỉtrả về và các giá trị của các biến cục bộ, khôi phục các biến và chuyển tới địa chỉ trả về
Ví dụ: Tính N!
Trang 12Phương pháp đệ quy Phương pháp khử đệ quy
Function gt(n: Word): Longint;
GT := 1 ; For k:= 1 to n do GT := GT * k ; giaithua:= GT ;
end ;
5 Sự khác nhau giữa đệ quy và lặp: Sự so sánh trong phần này giúp học sinh phân biệt tốt hơn việc áp dụng các thuật toán tương ứng để giải toán một cách linh hoạt.
Giống nhau:
- Cả 2 phương pháp đều liên quan đến lặp
- Đều phải có điều kiện để kiểm tra tính dừng của vòng lặp
- Dừng khi điều kiện trong vòng lặp sai
- Chương trình chạy nhanh và sử dụng ít bộ nhớ
Lưu ý: Mặc dù phương pháp lặp vẫn được sử dụng cho nhiều bài toán, tuy nhiên tồn tại
nhiều bài toán chỉ có thể giải bằng đệ quy
Trang 13II GIẢI PHÁP NÂNG CAO HIỆU QUẢ ÔN LUYỆN THI HSG THÔNG QUA CÁC BÀI TẬP VÍ DỤ ĐỆ QUY, KHỬ ĐỆ QUY VÀ ĐỆ QUY QUAY LUI.
Như đã đề cập trên phần đầu của SKKN, sau khi phân tích các khái niệm, ưu-nhược điểm của từng đối tượng đệ quy, đệ quy quay lui, khử đệ quy tôi sẽ xây dựng các bài toán
từ đơn giản đến phức tạp, mỗi bài toán có thể có một phương pháp hoặc cả 3 phương pháp tương ứng với các đối tượng trên nhằm giúp cho học sinh áp dụng linh hoạt trong quá trình xây dựng thuật toán (code cụ thể nằm trong phần phụ lục) Đặc biệt mỗi bài toán sẽ
có bộ test (ghi trên đĩa CD) để học sinh tối ưu được thuật toán của mình cũng như tạo hứng thú trong học tập.
1 Các bài tập cơ bản về đệ quy và không đệ quy:
BÀI 1: Cho n là một số nguyên dương, hãy tính lũy thừa a n
Function LT(a,n: Word): Longint;
BÀI 2: Cho n là một số nguyên dương, tính tổng S=1+2+3+ +n
BÀI 3: Cho n là một số nguyên dương, Tìm số fibonaxi thứ n
Function Fibo(n:longint):longint;
Begin
If ((n=0)or(n=1)) then Fibo:=1
else Fibo:=Fibo(n-2)+Fibo(n-1);
function Fibo(n : int64):int64;
var f0, f1, fi:int64; i :integer;
begin
if n<=1 then exit;
Trang 14End; // CHẠY CHẬM KHI N=45 f0:=0; f1:=1;
for i:=2 to n do begin fi:=f1 + f0; f0:=f1; f1:=fi; end;
fibo:=fi;
end;
BÀI 4: Tìm ước chung lớn nhất của 2 số nguyên dương.
If m>n then m:=m-n else n:=n-m; UCLN:=m;
End;
2 Các bài tập đệ quy và đệ quy quay lui:
BÀI 1: Liệt kê tất cả các hoán vị n số tự nhiên nguyên dương đầu tiên theo thứ tự tăng dần của từ điển:
Ví dụ: N = 3 gồm các hoán vị: 123, 132, 213, 231, 312, 321
Hướng dẫn:
- Với N=1 thì chỉ có 1 hoán vị duy nhất là: 1
- Với N= 2 thì có 2 hoán vị là:
+ Khi chọn 1 là số đứng đầu, ta có hoán vị: 1 2
+ Khi chọn 2 là số đứng đầu, ta có hoán vị: 2 1
- Với N=3:
+ Khi chọn 1 là số đứng đầu, ta có 2 hoán vị: 1 2 3; 1 3 2
+ Khi chọn 2 là số đứng đầu, ta có 2 hoán vị: 2 1 3; 2 3 1
+ Khi chọn 3 là số đứng đầu, ta có 2 hoán vị: 3 2 1; 3 1 2
Trang 15- Chọn được: khi giá trị i chưa được chọn.
- Phương pháp tổ chức lưu trữ: Dùng một mảng một chiều KTra1 có N phần tử mang kiểu
dữ liệu Boolean Giá trị khởi tạo ban đầu của các phần tử đều là True
Giá trị i chưa được chọn khi KTra1[i]= True
- Thực hiện bước đi thứ j:
+ Đánh dấu giá trị được chọn: KTra1[i]:= False
+ Gán giá trị của i cho số thứ j:
- Cách tổ chức lưu trữ: Dùng một mảng một chiều KTra2 có N phần tử để lưu các giá trị đãđược chọn:
Lưu vết: KTra2[j]:=i;
- Thành công: Khi đã chọn đủ N số ( j=N)
- Hủy bước đi thứ j: gán giá trị True cho KTra1[i]: KTra1[i]: =True;
Thuật toán: (Code tham khảo trong phần phụ lục)
endelse try(j+1);
ktra1[i]:=true;
end;
end;
Chương trình chính: thực hiện gọi try(1);
BÀI 2: Liệt kê dãy nhị phân có độ dài n
Biểu diễn dãy nhị phân có độ dài n dưới dạng a[1 n] ta sẽ liệt kê các dãy nhị phânbằng cách thử dùng các giá trị {0,1} gán cho a[i] Với mỗi giá trị thử gán cho a[i] lại thử các giá trị có thể gán cho a[i+1] Ví dụ với n=3, cây tìm kiếm quay lui như sau:
Trang 16Thuật toán: (Code tham khảo trong phần phụ lục)
if i=n then xuat {nếu thử đến cấu hình cuối thì in kết quả}
else try(i+1); {nếu chưa phải cấu hình cuối thì gọi đệ quy chọn tiếp
a[i+1]}
end;
end;
Chương trình chính: thực hiện gọi try(1);
BÀI 3: Bài toán rút tiền tự động ATM
Một máy rút tiền tự động ATM có n (n<=20) tờ tiền có giá trị t1,t2,…,tn Hãy đưa ra mộtcách trả với số tiền đúng bằng S
Dữ liệu vào từ file “ATM.INP” có dạng:
Trang 17Yêu cầu: Cho n và dãy số a1 a2, an Hãy tìm số lượng các số trung bình cộng trong dãy.
Dữ liệu vào: Từ tệp TBC.INP
- Dòng đầu ghi số nguyên dương n (3 < n < 1000)
- Dòng thứ hai chứa n số nguyên ai (|ai|< 108) mỗi số cách nhau bởi dấu cách
Kết quả ra : Ghi vào tệp TBC.OUT số lượng các số trung Bình cộng trong dãy.
Trang 18Trong dịp nghi lễ 30 tháng 4 và 1 tháng 5 vừa qua do cùng đợt nghỉ với ngày giỗ tổHùng Vương 10 tháng 3(âm lịch) nên số ngày nghỉ lễ tăng lên Vì thế lượng khách du lịch
đổ về Nha Trang tham quan cũng tăng kỷ lục, dẫn đến tinh trạng các khách sạn ở
đây “cháy phòng” Khách sạn Quang Huy chỉ còn một phòng nên quyết định cho thuê
phòng này theo hình thức thỏa thuận về giá cả Sau khi tổng hợp các đơn đặt hàng, kháchsạn nhận được n đơn đặt hàng, trong đó đơn đặt hàng thứ i đăng ký ngày bắt đầu là ai, ngàytrả phòng là bi và chấp nhận trả số tiền thuê phòng là ci Do có nhiều đơn đặt hàng, thờigian đặt phòng lại chồng chéo nhau, số tiền khách hàng chấp nhận trả cho khách sạn cũngkhác nhau nên ban quản lý khách sạn đang rất khó khăn không biết nhận lời hay từ chốikhách hàng nào
Yêu cầu: Viết chương trình giúp khách sạn nhận đơn đặt phòng sao cho lợi nhuận thu được
là lớn nhất
Lưu ý: Theo điều lệ của khách sạn, khách hàng phải trả phòng trước 12 giờ trưa, khách
hàng khác có thể nhận phòng từ 12 giờ trong một ngày
Dữ liệu vào: được ghi trên tệp khachsan.inp bao gồm:
- Dòng thứ nhất là số nguyên n (1 ≤ n ≤ 12000) thể hiện số đơn đặt hàng
- n dòng tiếp theo gồm 3 số nguyên ai, bi và ci Mỗi số cách nhau một khoảng trắng với ràngbuộc(l ≤ai ≤ bi ≤ 100, 0 ≤ ci ≤1000)
Dữ liệu ra: lưu trong tệp khachsan.out với một số nguyên thể hiện số tiền lớn nhất.
Trang 19lý chương trình.
Bản thân tôi nhận thấy việc phân tích và áp dụng phương pháp đệ quy, khử đệ quy và đệquy quay lui để giải một số bài toán giúp cho các đối tượng tham gia đạt được một số kếtquả sau:
Đối với giáo viên tham gia giảng dạy:
- Tăng cường tiếp thu các kiến thức tư duy giải thuật, bồi dưỡng và trau dồi kiến thức
- Quá trình ôn thi học sinh giỏi không phải chỉ là cách truyền đạt kiến thức một chiều,
mà bản thân giáo viên cũng được học tập từ các em học sinh
- Thông qua các bài toán giải bằng phương pháp đệ quy, khử đệ quy, đệ quy quay luigiúp giáo viên có kiến thức rõ nét hơn trong việc phân tích thuật toán và làm chochương trình mượt hơn khi nói về tốc độ xử lý, không gian lưu trữ
- Xây dựng các test cho chương trình để tạo hứng thú học tập cũng như là thử nghiệmnhững đặc trưng và nhược điểm của phương pháp đệ quy
Đối với học sinh trực tiếp tham gia ôn luyện:
- Biết phân tích, đánh giá giải thuật từ đó xây dựng chương trình hoàn thiện hơn,nhằm vét tất cả các test trong đề thi
- Hứng thú học tập thông qua cách chấm điểm từ các test được giáo viên xây dựng
- Kết quả các năm ôn thi của học sinh:
TT Họ và tên Giải Năm học
1 Nguyễn Thị Thu Trang KK 2015
2 Nguyễn Thị Đức Ba 2017
3 Đồng Đức Mạnh Ba 2017
4 Trần Tuấn Anh KK 2018
5 Phạm Hoàng Quân KK 2018
Trang 20C KẾT LUẬN VÀ KIẾN NGHỊ
I Kết luận:
Với mục đích luôn hướng tới kết quả tốt nhất trong quá trình ôn thi HSG, việc bản thângiáo viên giảng dạy luôn phải cập nhật kiến thức và luôn phải có tính sáng tạo là điều tấtyếu
Tùy vào khả năng tiếp cận của học sinh mà việc áp dụng các kiến thức mới và ở mức độkhó là khác nhau Do đó đối với những bài toán thiên về hướng giải quyết bằng phươngpháp đệ quy thông thường được áp dụng đối với những học sinh có khả năng đạt giải 3 trởlên, việc áp dụng đối với những học sinh mức độ tư duy thuật toán yếu hơn sẽ có tính khảthi không cao, vì bản thân các em chưa phân tích được độ phức tạp của thuật toán, vùngnhớ lưu trữ khi thực hiện lời gọi đệ quy (vùng nhớ tạm lưu trữ giá trị khi chưa thực hiện)
II Những kiến nghị - đề xuất:
Trong quá trình ôn luyện, bản thân tôi nhận thấy việc ôn thi để có kết quả cao thật sựkhông phải dễ dàng, bởi bị chi phối các yếu tố như:
- Học sinh không muốn thi môn Tin học vì môn này không thi Đại học, cao đẳng
- Tư duy lập trình phức tạp, học sinh dễ chán nản
Chính vì vậy tôi mạnh dạn đề xuất vấn đề ôn luyện thi học sinh giỏi môn Tin học nhưsau:
- Bản thân các cán bộ giáo viên, đặc biệt là Ban Giám hiệu nhà trường cũng như giáoviên chủ nhiệm cần động viên, khuyến khích tạo động lực để các em tham gia
- Tại các đơn vị trường THPT không phải là trường điểm, việc tuyển học sinh là rấtkhó có chất lượng, nên cần phải động viên các em tham gia có thể thi 2 môn (vìmôn Tin học thi vào buổi chiều tách biệt với các môn tự nhiên thi vào buổi sáng)
Tôi xin cam đoan đây là SKKN của mình viết,không sao chép nội dung của người khác
(Ký và ghi rõ họ tên)
Trần Ngọc Dương
Trang 21DANH MỤC
SÁNG KIẾN KINH NGHIỆM ĐÃ ĐƯỢC HỘI ĐỒNG SÁNG KIẾN KINH
NGHIỆM NGÀNH GIÁO DỤC XẾP LOẠI TỪ C TRỞ LÊN
Họ và tên tác giả: Trần Ngọc Dương
Chức vụ và đơn vị công tác: Giáo viên, trường THPT Nông Cống 4
loại
Năm cấp
Số, ngày, tháng, năm của quyết định công nhận, cơ quan ban hành QĐ
1. Một số kinh nghiệm xây dựng giáo án
điện tử trong dạy học C 2008
QĐ số: 932/QĐ-SGD ngày11/12/2008
2 Một số kinh nghiệm thiết kế bài giảng
điện tử E-Learning B 2011
QĐ số: 539/QĐ-SGD&ĐTngày 22/10/2011
3
Một số kinh nghiệm dạy học tích hợp
chương trình mã nguồn mở (Open
Office) vào việc dạy học soạn thảo
văn bản – Chương III, SGK lớp 10
B 2014 QĐ số: 753/QĐ-SGD&ĐT
ngày 03/11/2014
4
Một số kinh nghiệm xây dựng hệ
thống mạng nội bộ không dây
(W-LAN) nhằm nâng cao hiệu quả sử
dụng phần mềm VEMIS
C 2016 QĐ số: 972/QĐ-SGD&ĐT
ngày 24/11/2016
TÀI LIỆU THAM KHẢO:
[1] Nguyễn Hải Lộc - Nguyễn Thanh Tiên, Bài giảng ngôn ngữ lập trình Pascal, Đại học sưphạm Huế
[2] Đỗ Xuân Lôi, Cấu trúc dữ liệu và giải thuật, Nhà xuất bản khoa học và kỹ thuật
[3] Các tài liệu về Đệ quy trên Internet
Trang 22PHỤ LỤC
CÀI ĐẶT CÁC BÀI TẬP TIÊU BIỂU VỀ ĐỆ QUY, ĐỆ QUY QUAY LUI
TRONG ÔN THI HSG (CODE VÀ TEST TRONG ĐĨA CD)
1 Các bài tập cơ bản về đệ quy:
BÀI 1: Cho n là một số nguyên dương, hãy tính lũy
thừa a n
Const fi='LUYTHUA.inp'; fo=' LUYTHUA.out';
Var a,n: longint; f:text;
Const fi='Tong.inp'; fo='Tong.out';
Var n:longint; f:text;
Trang 23Assign(f,fo); Rewrite(f); Writeln(f,S(n)); Close(f);
End;
Begin
Doc; Ghi;
End.
Bài 3: Bài toán về biểu dãy số Phi-bô-na-xi
Dãy số Phi-bô-na-xi được định nghĩa như sau: F0 = 0; F1 = 1; FN = FN-1 + FN-2 với N≥2;
Yêu cầu: Viết chương trình tìm số hạng thứ N của dãy Phi-bô-na-xi.
Dữ liệu: Vào từ file văn bản BAI2.INP gồm 1 dòng duy nhất ghi số N.
Kết quả: Ghi ra file văn bản có tên BAI2.OUT là số hạng thứ N của dãy.