DH GQVĐ là phương pháp thích hợp với các bài giảng về cách giải một bài toán
trên máy tính. Đây là phương pháp dễ áp dụng và dễ đạt hiệu quả cao khi dạy nội dung
này. Áp dụng phương pháp DH GQVĐ sẽ kích hoạt tính tích cực của SV, tạo điều kiện
cho SV chủ động tìm kiếm tri thức, nâng cao hiệu quả học tập, có điều kiện rèn luyện toàn
diện bản thân. Những cái khó khi áp dụng phương pháp này là GV phải rất hiểu trình độ
của SV, phải nắm rất vững nội dung bài dạy và luôn linh hoạt khéo léo đưa SV vào hoàn
cảnh có vấn đề, giúp họ giải quyết vấn đề để thoát khỏi tình huống đó. Ngoài ra, GV phải
luôn luôn quản lí tốt thời gian và tiến trình giờ giảng. Cuối cùng, GV phải biết kết hợp với
các phương pháp dạy học khác khi cần thiết. Có như vậy mới có thể đạt được những giờ
dạy thành công.
13 trang |
Chia sẻ: aquilety | Lượt xem: 2332 | Lượt tải: 1
Bạn đang xem nội dung tài liệu Dạy học giải quyết vấn đề trong giảng dạy phương pháp giải một bài toán trên máy tính điện tử, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
JOURNAL OF SCIENCE OF HNUE
Education Science, 2013, Vol. 58, No. 4, pp. 21-33
This paper is available online at
DẠY HỌC GIẢI QUYẾT VẤN ĐỀ TRONG GIẢNG DẠY
PHƯƠNG PHÁP GIẢI MỘT BÀI TOÁN TRÊN MÁY TÍNH ĐIỆN TỬ
Nguyễn Tân Ân
Khoa Công nghệ Thông tin, Trường Đại học Sư phạm Hà Nội
Tóm tắt. Bài báo trình bày tóm lược về phương pháp dạy học giải quyết vấn đề, sự
phù hợp của phương pháp này trong đào tạo nguồn nhân lực Công nghệ Thông tin
và Truyền thông nói chung và trong giảng dạy nội dung giải một bài toán trên máy
tính điện tử nói riêng. Bài báo cũng đưa ra kịch bản phác thảo để dạy giải bài toán
“Tám Quân Hậu” theo phương pháp này. Các kết quả thử nghiệm đều khẳng định
phương pháp dạy học giải quyết vấn đề là phương pháp huy động được tính tích
cực của sinh viên, phù hợp với mục tiêu đổi mới phương pháp dạy học hiện nay và
rất thích hợp khi giảng dạy nội dung giải một bài toán trên máy tính điện tử.
Từ khóa: Dạy học giải quyết vấn đề, đổi mới phương pháp dạy học, dạy học Tin
học, bài toán Tám Quân Hậu.
1. Mở đầu
Để đổi mới phương pháp giảng dạy, các nhà sư phạm đã đưa ra rất nhiều quan điểm
khác nhau, nhưng gần như tất cả các quan điểm đó đều thống nhất rằng trong quá trình
dạy học phải làm sao tích cực hóa hoạt động nhận thức của sinh viên (SV), biến quá trình
nhận thức thụ động của SV thành quá trình SV chủ động xây dựng tri thức cho bản thân,
biến quá trình đào tạo SV thành quá trình SV tự đào tạo dưới sự hướng dẫn của giảng viên
(GV). Lấy người học làm trung tâm là một thuật ngữ được nhiều người dùng khi nói về
đổi mới phương pháp dạy học.
Kiến thức thuộc lĩnh vực Công nghệ Thông tin và Truyền thông (CNTT&TT) được
đưa vào giảng dạy rộng rãi trong nhà trường muộn hơn rất nhiều so với các nội dung khoa
học khác. Phương pháp giảng dạy các môn thuộc lĩnh vực CNTT&TT cũng có nhiều điểm
không giống với phương pháp giảng dạy các môn thuộc các lĩnh vực khoa học khác. Trong
CNTT&TT, có những nội dung chỉ thích hợp với những cách dạy theo kiểu “dắt tay chỉ
việc”. Ví dụ, giảng dạy sử dụng phần mềm, thật khó kiến tạo hay nêu vấn đề khi GV
hướng dẫn SV thực hiện một tác vụ kiểu như chèn một bức ảnh từ file vào văn bản soạn
Ngày nhận bài: 5-6-2012. Ngày chấp nhận đăng: 16-1-2013
Liên hệ: Nguyễn Tân Ân, e-mail: nguyentanan@yahoo.com
21
Nguyễn Tân Ân
thảo với Microsoft Office Word 2007: Đưa con trỏ đến vị trí muốn chèn bức ảnh→ Vào
menu Insert→ Picture→ Chọn file lưu bức ảnh cần chèn→ Kích nút Insert. Tuy nhiên,
cũng có những nội dung đầy chất tư duy, thậm chí có cả yếu tố nghệ thuật như những môn
liên quan đến lập trình.
Trong đào tạo nguồn nhân lực CNTT&TT [1,2], những phương pháp giảng dạy huy
động sự tích cực của người học đặc biệt thích hợp. Kiến thức trong lĩnh vực CNTT&TT
thay đổi rất nhanh, những người làm công tác CNTT&TT hầu hết là những người năng
động, thực tế, sáng tạo và có khả năng tự cập nhật kiến thức mới. Để đào tạo những con
người như thế, cần phải áp dụng những phương pháp dạy học tích cực, tạo điều kiện cho
SV sớm được rèn luyện theo những đòi hỏi đặc thù của nghề nghiệp. Phương pháp dạy
học giải quyết vấn đề (DH GQVĐ) là phương pháp dạy học tích cực và rất thích hợp khi
giảng dạy nhiều nội dung trong đào tạo nguồn nhân lực CNTT&TT.
Bài báo này trình bày việc áp dụng phương pháp DH GQVĐ trong giảng dạy cách
giải một bài toán trên máy tính điện tử (computer, sau đây ta gọi chung là máy tính), một
nội dung cốt lõi trong mọi chương trình đào tạo CNTT&TT.
2. Nội dung nghiên cứu
2.1. Phương pháp DH GQVĐ
2.1.1. Khái niệm
DH GQVĐ [1,4,6] là phương pháp dạy học, theo đó, GV đặt ra cho SV một hay
một hệ thống vấn đề nhận thức, đưa SV vào tình huống có vấn đề, từ đó hướng dẫn, điều
khiển SV giải quyết vấn đề, giúp SV chủ động trong học tập để nắm được nội dung bài
học và thoát khỏi tình huống có vấn đề.
DH GQVĐ phù hợp với tinh thần của lí thuyết nhận thức, phù hợp với quan điểm
lấy người học làm trung tâm.
Một cách tự nhiên, thông qua các vấn đề được đặt ra, được hướng dẫn giải quyết
nối tiếp nhau, phương pháp này luôn kích hoạt tính tích cực học tập của SV, do vậy khi sử
dụng phương pháp này một cách phù hợp sẽ cuốn hút được SV vào bài giảng và gây hiệu
quả nhận thức cao.
Phương pháp này đặc biệt thích hợp với giảng dạy đại học hay giảng dạy ở các
trường chuyên nghiệp, bởi khả năng giúp SV rèn luyện phong cách làm việc tích cực, sáng
tạo, sớm hình thành thói quen tìm tòi, nghiên cứu.
2.1.2. Những chú ý khi áp dụng phương pháp dạy học giải quyết vấn đề
- Vấn đề đưa ra phải phù hợp với thời điểm, hoàn cảnh và đặc biệt phải phù hợp với
đối tượng sinh viên, đảm bảo đưa SV vào tính huống có vấn đề. Đặt vấn đề quá khó hay
quá dễ đều không thể đưa SV vào tình huống có vấn đề. Mức độ thành công của phương
pháp này phụ thuộc rất nhiều vào nghệ thuật đặt vấn đề và dẫn dắt giải quyết vấn đề của
GV. Muốn thành công, GV phải nắm chắc kiến thức, phải hiểu SV. Vì thế, cùng một giáo
án, khi dạy ở các lớp khác nhau sẽ được nêu vấn đề theo những cách thức và mức độ
22
Dạy học giải quyết vấn đề trong giảng dạy phương pháp giải một bài toán trên máy tính ...
khác nhau.
- Sau khi đặt vấn đề, việc hướng dẫn SV trong quá trình giải quyết vấn đề phải rất
linh hoạt. Kịp thời khuyến khích những hướng đi đúng và khuyến khích những giải pháp
tốt đồng thời uốn nắn những giải pháp không hợp lí hoặc không sát với mục đích mà GV
đang hướng quá trình nhận thức của SV đạt tới. Phần tóm tắt, hệ thống hóa kiến thức từng
phần hay toàn bài phải cô đọng, ngắn gọn, nêu được giải pháp giải quyết vấn đề đang
cần tìm.
- Chú ý quản lí thời gian và tiến trình giờ giảng cho tốt. Trong khuôn khổ thời gian
của một bài dạy, nếu cách nêu vấn đề không được chuẩn bị kĩ, nếu hướng dẫn thảo luận
hoặc nhận xét những giải pháp mà SV đưa ra còn lan man, việc tổng kết không trọng tâm
trọng điểm,... dễ làm cho bài giảng thiếu thời gian, không đạt kết quả mong muốn.
- Nên phối hợp phương pháp này với các phương pháp giảng dạy khác. Không nên
áp dụng đơn điệu một phương pháp. Trong mỗi bài dạy nên có một phương pháp chủ đạo
và nhiều phương pháp khác bổ trợ.
2.2. Dạy học giải quyết vấn đề rất thích hợp khi giảng dạy cách giải một
bài toán trên máy tính
2.2.1. Bài toán
Trước tiên, cần nói rằng trong Tin học có những bài toán không thể giải trên máy
tính theo cách thông thường. Tính giải được và không giải được là một nội dung quan
trọng trong Lí thuyết Tính toán. Môn Trí tuệ nhân tạo đã cung cấp nhiều chiến lược tìm
kiếm lời giải [3]. Ở đây chúng ta chỉ xét những bài toán được phát biểu chỉnh với mô hình
như sau:
Cho Cái vào (Input); Cho Cái ra (Output); Cho những thao tác có thể được sử dụng
trong quá trình biến đổi từ Cái vào thành Cái ra.
Yêu cầu: Tìm Cái ra.
Những thao tác có thể được sử dụng trong quá trình biến đổi từ Cái vào thành Cái
ra nói chung không được phát biểu tường minh khi cho bài toán để giảng dạy hoặc kiểm
tra kiến thức của SV. Khi đó ta ngầm hiểu rằng, đó là các phương pháp tính toán, các công
thức, các định lí,... mà SV ở trình độ hiện tại phải biết và có thể áp dụng được. Các bài
toán vượt khỏi trình độ này có khi bị gọi là “đầu bài sai”. Sai ở đây có nghĩa là sai so với
phạm vi kiến thức của người được giao bài tập. Vì để giải bài toán, SV phải áp dụng cả
các kiến thức chưa được học. Lưu ý rằng, đầu bài là câu hỏi, mà câu hỏi thì không nhận
giá trị đúng/sai.
Vì thế, nhiều tài liệu chỉ viết rằng: Mô hình một bài toán gồm: Cho Cái vào, Cái
ra. Yêu cầu: Từ Cái vào tìm Cái ra?
2.2.2. Giải bài toán trên máy tính
Giải một bài toán trên máy tính có nghĩa là người giải phải tìm trong các thao tác
mà mình biết những thao tác cần thiết, sắp xếp các thao tác đó theo một trình tự thực hiện
23
Nguyễn Tân Ân
nhất định để sao cho sau một số hữu hạn bước từ Cái vào ta có Cái ra.
Chưa hết, tiếp đó người giải phải viết dãy các thao tác đó bằng một ngôn ngữ lập
trình để máy hiểu được, nhằm mục đích cuối cùng là “giao” cho máy thực hiện việc từ
Cái vào tìm Cái ra. Nếu “giao” xong, người dùng chỉ cần nạp vào Cái vào, máy tính sẽ
đưa ra Cái ra tương ứng. Đây chính là bước viết chương trình.
Để “giao” cho máy tính giải bài toán và hoàn thiện phần mềm giải bài toán, nói
chung cần thực hiện 5 bước sau:
Bước 1. Xác định bài toán: Xác định bài toán ở đây chính là việc xác định rõ Cái
vào, Cái ra.
Bước 2. Lựa chọn hoặc thiết kế giải thuật: Thường khi thiết kế hoặc chọn giải thuật,
người giải đồng thời phải nghĩ ngay đến việc tổ chức dữ liệu.
Bước 3. Viết chương trình: Bước này chính là bước người giải cài đặt giải thuật cùng
cấu trúc dữ liệu xác định ở bước trên. Đó chính là việc viết chương trình sao cho có thể
“giao” cho máy thực hiện việc giải bài toán.
Bước 4. Kiểm thử và hiệu chỉnh chương trình: Đây là bước kiểm thử. Nếu chương
trình còn lỗi, phải sửa hết lỗi.
Bước 5. Viết tài liệu: Tài liệu phải mô tả chi tiết bài toán, thuật toán, chương trình,
hướng dẫn sử dụng... Tài liệu rất có ích và cần thiết cho người sử dụng chương trình và
những người quan tâm nhằm hiểu, khai thác tốt và bảo trì, nâng cấp chương trình.
Các bước trên có thể lặp đi lặp lại nhiều lần cho đến khi tạm đạt yêu cầu. Vì thế, ta
thấy, với mỗi chương trình thường có các phiên bản khác nhau. Phiên bản sau là cải tiến
của phiên bản trước.
Trong 5 bước kể trên, hai bước: Bước 2. Tìm kiếm hoặc thiết kế giải thuật và Bước
3. Viết chương trình là hai bước khó nhất và cũng quan trọng nhất. Tất nhiên, để thực hiện
được hai bước này, SV phải qua được Bước 1. Tìm hiểu/xác định bài toán.
Trong khuôn khổ của bài báo, chúng ta chỉ bàn đến giảng dạy ba bước này.
2.2.3. Phương pháp DH GQVĐ rất thích hợp khi giảng dạy giải một bài toán trên
máy tính
Giảng dạy Bước 1, tìm hiểu/xác định bài toán, thông thường GV dùng phương pháp
thuyết trình, giảng giải cặn kẽ, thống nhất những khái niệm, những thuật ngữ ghi trong
đầu bài, giúp SV hiểu rõ Cái vào, Cái ra. Còn những thao tác được áp dụng, mặc nhiên
đó là những thao tác mà SV ở trình độ hiện tại đã biết, không cần nhắc lại nữa.
Giảng dạy Bước 2, GV dẫn dắt SV tìm kiếm/lựa chọn giải thuật. Dễ thấy rằng quá
trình tìm kiếm giải thuật chính là quá trình tìm cách giải quyết bài toán. Dẫn dắt SV thực
hiện bước này, nếu cứ theo đúng logic của nội dung, với cách nêu vấn đề phù hợp, tự nhiên
GV đã theo phương pháp DH GQVĐ.
Tiếp theo, đối với Bước 3, bước viết chương trình, đây là bước GV dẫn dắt SV mã
hóa giải thuật trên (viết code). Bước này đòi hỏi phải hiểu máy tính, hiểu ngôn ngữ lập
trình sẽ dùng, hiểu cách cài đặt các cấu trúc dữ liệu liên quan bằng ngôn ngữ lập trình
24
Dạy học giải quyết vấn đề trong giảng dạy phương pháp giải một bài toán trên máy tính ...
định sử dụng... Vấn đề đặt ra ở bước này chính là: Làm thế nào để có thể viết giải thuật
vừa tìm được ở bước trên bằng ngôn ngữ lập trình định sử dụng. Khi dẫn dắt SV thực
hiện bước viết chương trình, bằng cách nêu vấn đề khéo léo dựa trên những kiến thức đã
có về cấu trúc dữ liệu, về ngôn ngữ lập trình đã có của SV, GV đưa SV vào hoàn cảnh có
vấn đề. Giải quyết vấn đề ở bước này chính là chuyển từng câu, từng đoạn lệnh trong giải
thuật vừa tìm được ở bước trước sang cách diễn đạt bằng ngôn ngữ lập trình định dùng.
Kết quả bước này là một chương trình hoàn chỉnh.
Dưới đây ta sẽ xét một ví dụ cụ thể.
2.3. Áp dụng phương pháp DHGQVĐ trong giảng dạy giải bài toán “Tám
Quân Hậu”
Khi giảng dạy Cấu trúc dữ liệu và Giải thuật, một môn học rất cơ bản trong mọi
chương trình đào tạo, ta gặp rất nghiều trường hợp tương tự như giải một bài toán trên
máy tính. Sau đây là một ví dụ:
Trong cuốn Cấu trúc dữ liệu và Giải thuật của tác giả Đỗ Xuân Lôi [5], ở Chương
3: Đệ qui, sau phần những kiến thức về đệ qui, tác giả có đưa ra 4 ví dụ áp dụng từ dễ đến
khó: 1). Tính n!; 2). Tính số hạng thứ n của dãy FIBONACI; 3). Bài toán "Tháp Hà Nội";
4). Bài toán “Tám Quân Hậu”. Qua 4 ví dụ này, SV sẽ củng cố được kiến thức lí thuyết,
có khả năng áp dụng giải thuật đệ qui đồng thời kiến thức chung về giải một bài toán trên
máy tính một lần nữa được củng cố.
Ta hãy phác thảo kịch bản giảng dạy ví dụ thứ 4 theo mục đích của sách đã dẫn: Bài
toán “Tám Quân Hậu”.
Bài toán: Hãy đặt 8 quân hậu lên bàn cờ sao cho không quân nào ăn được
quân nào! [5].
Bước 1. Xác định bài toán:
GV (Dùng phương pháp thuyết trình):
Cái vào: Bàn cờ Vua và 8 quân hậu. (GV giải thích thế nào là bàn cờ (bàn cờ Vua),
thế nào là quân hậu và khả năng đi, khả năng ăn của quân hậu (theo luật cờ Vua)).
Cái ra: Một cách đặt 8 quân hậu vào các ô trên bàn cờ sao cho không quân nào ăn
được quân nào.
Bước 2. Lựa chọn hoặc thiết kế giải thuật:
GV (Nêu câu hỏi đưa SV vào tình huống có vấn đề):
Làm thế nào để đặt 8 quân hậu lên bàn cờ sao cho không quân nào ăn được
quân nào?
(Yêu cầu trả lời bằng ngôn ngữ tiếng Việt, chưa vận dụng kiến thức Tin, kiến thức
Toán đặc biệt nào vào đây).
Có thể có nhiều câu trả lời. Trường hợp gặp SV đã học đâu đó một cách giải và họ
trình bày cách giải đó, GV (có thể) hỏi thêm: Tính đệ qui trong cách giải của anh/chị thể
hiện ở chỗ nào? (ta đang học giải thuật đệ qui), và khả năng cài đặt cách làm đó lên máy
tính? Có bao nhiêu cách làm (có bao nhiêu nghiệm)?... Nếu SV trả lời được, thì đây là SV
25
Nguyễn Tân Ân
đã học trước và đã hiểu rõ vấn đề, ta yêu cầu SV này ngồi nghe và theo dõi cách giải quyết
của các bạn, sau đó sẽ được gọi để nhận xét. Ta sẽ sử dụng SV này để cùng dẫn dắt quá
trình nhận thức của các SV khác theo mục đích bài giảng. Đại đa số các sinh viên chưa
học hoặc đã học nhưng không nắm chắc vấn đề do đó trả lời không rõ ràng, không đầy đủ.
Thường gặp câu trả lời:
SV: Em đổ 8 quân hậu lên bàn cờ rồi mò ra một cách đặt.
GV: Các bạn hãy nhận xét cách làm trên.
SV: (Thảo luận).
GV (Tổng kết lại): Cách làm đó cũng có thể tìm ra được ít nhất một cách đặt. Tuy
nhiên theo cách làm đó không dễ biết sẽ có bao nhiêu cách đặt bởi sau mỗi cách tìm được,
khó biết có còn cách nào nữa hay không? Đồng thời, lưu ý rằng, cách làm đó không theo
một chiến lược rõ ràng nào cả nên rất khó cài đặt trên máy tính. Ai có cách làm khác?
SV (Trình bày cách khác): Em đặt quân hậu thứ nhất lên một ô bất kì trên bàn cờ và
bỏ đi hàng ngang, hàng dọc, các đường chéo đi qua ô đó (dùng bút hoặc phấn vạch đường
đánh dấu bỏ). Bàn cờ còn lại hẹp hơn và em lại đặt quân thứ 2 lên phần còn lại của bàn cờ
và lại bỏ đi hàng ngang, hàng dọc, các đường chéo đi qua ô có quân thứ 2 đó. Bàn cờ bây
giờ hẹp hơn nữa... Và quá trình tiếp tục cho đến khi hết 8 quân hậu.
GV (Sau khi nghe các SV khác nhận xét, nêu câu hỏi): Liệu quá trình có thể đi đến
hồi hết cả 8 quân hậu không? Ví dụ sau quân thứ j, với j < 8, đến quân thứ j + 1 thì
không thể đặt vào đâu được vì ô nào cũng có đường dánh dấu bỏ đi qua. Có ô bị vài đường
đánh dấu bỏ đi qua, ô ít nhất cũng có một đường đánh dấu bỏ. Giải quyết thế nào đây?
SV: (Thảo luận).
GV (Chốt lại): Khi đó phải quay lui. Quá trình quay lui như sau: Nhấc quân hậu j
ra để đặt vào vị trí khác nếu quân hậu j có nhiều hơn 1 chỗ để đặt. Nếu quân hậu j chỉ có
mỗi chỗ đó để đặt thôi thì không thể đặt nó ra chỗ khác, ta nhấc tiếp quân j − 1 ra... cho
đến khi gặp quân có nhiều hơn 1 khả năng để đặt, ta sẽ đặt nó vào chỗ khác và quá trình
lại tiếp tục. Điều đó có nghĩa là quá trình quay lui được thực hiện cho đến khi gặp trường
hợp có thể tiến được là tiến ngay.
Thử và quay lui như thế cho đến khi đặt hết được 8 quân hậu hoặc quay lui đến quân
đầu tiên và quân đầu tiên cũng đã được thử hết các khả năng bây giờ không còn khả năng
nào nữa.
Đây chính là gải thuật quay lui, một phương pháp không đệ qui để giải bài toán này.
GV (Gợi ý, dẫn dắt SV tìm nghiệm theo giải thuật đệ qui): Nếu biểu diễn nghiệm là
một vectơ X(x1, x2, ..., x8), mỗi tọa độ xj của nó lưu vị trí của một quân hậu thì nghiệm
của bài toán chính là một bộ tám “giá trị” của vectơ này. Lưu ý rằng, trong trường hợp
tổng quát, mỗi “giá trị” xj có thể là một bộ số mới có thể lưu được vị trí của quân hậu.
Nếu thế, đi tìm nghiệm của bài toán tức là đi tìm từng tọa độ của vectơ X . Có thể tìm
vectơ X bằng giải thuật đệ qui được không?
SV (Đã có kiến thức về đệ qui): Có thể! Ta tìm lần lượt từng tọa độ của vectơ X:
Đầu tiên tìm x1, sau đó tìm x2,... Giả sử ta đã tìm được xj , thế thì việc tìm xj+1 giống hệt
26
Dạy học giải quyết vấn đề trong giảng dạy phương pháp giải một bài toán trên máy tính ...
cách tìm xj nhưng kích thước bàn cờ bây giờ nhỏ hơn do trừ đi những ô đã bị đánh dấu
bỏ trước đó và bây giờ phải trừ tiếp đi những ô do đặt quân hâu j. Trường hợp suy biến là
trường hợp tìm x8.
GV: Rất tốt. Tuy nhiên khi thử đặt quân hậu j, làm thế nào để biết kết quả của việc
thử như thế là ĐƯỢC hay KHÔNGĐƯỢC để còn thử đặt tiếp quân hậu j+1 hay quay lui?
SV (Nhớ lại nội dung đã thảo luận ở trên): Việc đặt quân hậu j là ĐƯỢC khi và chỉ
khi tất cả các quân hậu tiếp theo đều có chỗ (chứ không phải ĐƯỢC có nghĩa là hiện tại
ô mà ta đặt quân hậu j là ô tự do, không quan tâm đến các quân tiếp sau).
Thế thì việc kiểm tra xem đặt quân hậu thứ j vào một ô tự do nào đó có ĐƯỢC hay
không chính là việc thử đặt quân hậu thứ j + 1. Nếu việc đặt quân hậu j + 1 mà ĐƯỢC
tức là việc đặt quân hậu thứ j là ĐƯỢC. Nếu việc đặt quân hậu thứ j + 1 là không thể có
nghĩa là việc đặt quân hậu j vào ô tự do vừa rồi là KHÔNG ĐƯỢC, ta phải cất quân hậu
j đi để thử lại vào ô tự do khác. Chú ý rằng nếu quân hậu j đã là quân hậu cuối cùng thì
chỉ cần đặt nó vào ô tự do nào đó là ĐƯỢC, không còn phải thử quân hậu tiếp theo nữa.
Tính đệ qui thể hiện ở chỗ: Việc thử quân hậu thứ j + 1 giống hệt cách làm với việc thử
đặt quân hậu j nhưng kích thước bàn cờ bây giờ nhỏ hơn do đã trừ đi các hàng, các cột,
các đường chéo qua ô đã có quân hậu trước và giờ lại thêm quân hậu j. Trường hợp suy
biến là trường hợp đặt quân hậu thứ 8.
Hình 1. Mỗi quân hậu chỉ được đặt trong cột của mình.
Đường chéo đi lên và đường chéo đi xuống qua ô (3,6).
GV: Rất tốt. Bây giờ
ta không chọn, đặt quân hậu
theo thứ tự một cách ngẫu
nhiên nữa mà ta hãy đánh
số thứ tự các quân hậu bằng
cách đặt 8 quân hậu lên đầu
8 cột (Hình 1). Số thứ tự
của cột chính là chỉ số của
quân hậu. Hơn nữa ta qui
định mỗi quân hậu chỉ được
đặt vào một hàng nào đó
thuộc cột của mình, ta có
cột mà quân hậu đứng đầu
(cột có chỉ số là chỉ số quân
hậu) hoàn toàn tự do với nó.
Muốn xem ô nào trong cột
của nó có tự do đối với nó hay không ta chỉ cần kiểm tra hàng và các đường chéo qua ô đó
có tự do hay không.
Trên Hình 1, chỉ số hàng là i, chỉ số cột là j. Chỉ số cột cũng là số hiệu (chỉ số) của
quân hậu.
GV (Hoàn chỉnh giải thuật): Ai có thể diễn đạt cách làm trên một cách chặt chẽ để
có giải thuật: Thử đặt quân hậu j lên lần lượt các hàng, bắt đầu từ hàng 1, trong cột của
nó (cột j) cho đến khi ĐƯỢC hoặc hết các hàng (đến hàng 8) mà vẫn KHÔNG ĐƯỢC thì
27
Nguyễn Tân Ân
cũng thôi?
SV: (Trình bày).
GV (Chốt lại): Giải thuật thử đặt quân hậu j như sau:
Thử (j, q); // Thử đặt quân hậu j, q là biến Boolean để lưu kết quả
1. i := 0; //Ban đầu gán chỉ số hàng bằng 0
2. Lặp:
3. i := i+1; //Tăng chỉ số hàng lên 1
4. q:= False; // Trước khi thử, gán q := False
5. Nếu ô (i,j) TỰ DO thì
6. begin
7. ĐẶT quân hậu j vào ô (i, j);
8. Nếu quân hậu j chưa phải là quân cuối thì Thử (j + 1, q);
9. Nếu KHÔNGĐƯỢC thì CẤT QUÂNHẬU j đi, ngược lại q :=
True;
10. end;
11. Cho đến khi: ĐƯỢC hoặc đã thử đến hàng cuối mà vẫn chưa ĐƯỢC thì cũngthôi;
12. Return;
GV (Củng cố):
- Trong giải thuật trên, thao tác ở dòng 8 chính là thao tác kiểm tra xem thao tác ở
dòng 7 có ĐƯỢC hay KHÔNG ĐƯỢC. Qui ước ĐƯỢC sẽ gán cho q := True, trường
hợp KHÔNG ĐƯỢC, do lệnh gán ở dòng 4, q vẫn bằng False.
- Theo giải thuật trên, ta chỉ cần gọi Try(1,q) để thử đặt quân hậu 1 lên lần lượt các
hàng của nó, khi gặp trường hợp ĐƯỢC, vòng lặp dừng và mảngX lưu lại một phương án
đặt, đó là nghiệm đầu tiên. Nếu phải thử đến hàng 8 và vẫn KHÔNG ĐƯỢC thì giải thuật
cũng dừng. Đây là trường hợp vô nghiệm. Tuy nhiên bài toán kinh điển này có nghiệm, ta
sẽ thấy điều này khi chạy thử chương trình. Nhưng bài toán có bao nhiêu nghiệm? Việc
cải tiến giải thuật trên để tìm tiếp các cách đặt khác là nhiệm vụ về nhà của SV ta sẽ nói
ở phần sau.
- Lưu ý rằng cũng có thể đặt 8 quân hậu vào cuối 8 cột/đầu 8 hàng/cuối 8 hàng.
Tìm được giải thuật SV tạm thoát khỏi tình huống có vấn đề.
Bước 3. Viết chương trình (dưới đây là quá trình dẫn dắt SV trình bày giải thuật trên
dưới dạng một thủ tục bằng ngôn ngữ PASCAL):
GV (Đưa SV vào hoàn cảnh có vấn đề): Viết giải thuật như trên chỉ người hiểu còn
máy không hiểu được. Điều kiện "Nếu ô (i, j) TỰ DO..."; Các thao tác đặt ĐẶT quân hậu,
CẤT quân hậu cần phải mã như thế nào để máy hiểu được?
SV: ???
GV: Nếu dùng mảng (x[1], x[2], ..., x[j], ..., x[8]), với các phần tử có kiểu nguyên
để lưu trữ nghiệm thì giá trị các phần tử của mảng phải lưu thông tin gì?
28
Dạy học giải quyết vấn đề trong giảng dạy phương pháp giải một bài toán trên máy tính ...
SV (Nhớ lại cách dùng vectơ X để lưu nghiệm đã nói ở trên): Giá trị của x[j] lưu vị
trí của quân hậu j. Nếu qui định quân hậu j chỉ được đặt trong cột j, tức là mỗi quân hậu
chỉ được đặt trong cột của mình mà không được đặt sang cột khác, thì x[j] chỉ cần lưu chỉ
số của hàng mà quân hậu j được đặt vào là đủ. Cụ thể: x[j] = i tức là quân hậu j được đặt
vào hàng i (của cột j). Nói cách khác nếu x[j] = i tức là quân hậu j được đặt vào ô (i, j).
Như vậy, mỗi bộ 8 giá trị của mảng này do chương trình tìm được sẽ là một nghiệm (một
phương án đặt 8 quân hậu mà không quân nào ăn được quân nào).
GV: Khi nào ô (i, j) tự do đối với quân hậu j?
SV: Ô (i, j) là TỰ DO đối với quân hậu j khi và chỉ khi hàng i TỰ DO, đường chéo
đi lên qua ô (i, j) TỰ DO, đường chéo đi xuống qua ô (i, j) TỰ DO. (Cột j đương nhiên
là tự do đối với quân hậu j, nên không cần kiểm tra nữa).
GV: Để kí hiệu (để mã) sự kiện hàng i tự do hay không ta làm thế nào?
SV: (Thảo luận).
GV: Ta dùng mảng a[i] có các phần tử kiểu Boolean để lưu trữ kết quả tự do hay
không của các hàng. Ý nghĩa các giá trị của mảng này như sau: Nếu a[i] = True thì hàng
i tự do, ngược lại thì không. Ví dụ a[3] = True có nghĩa là hàng 3 tự do. Bàn cờ có 8
hàng nên i có 8 giá trị có nghĩa. Nên cho i chạy từ 1 tới 8.
GV: Làm thế nào để kí hiệu (để mã) sự kiện đường chéo đi lên qua ô (i, j) có tự do
hay không? Ai có nhận xét về các ô mà đường chéo đi lên qua ô (i, j) đi qua?
SV: Đường chéo đi lên qua ô (i, j) là đường chéo đi qua các ô có chỉ số hàng cộng
chỉ số cột bằng nhau và bằng chính (i+ j). Mỗi giá trị của tổng (i+ j) tương ứng với một
đường chéo đi lên.
GV: Ai có thể mã hóa sự kiện đường chéo đi lên qua ô (i, j) tự do/không tự do?
SV: Dễ thấy rằng:
(i+ j) nhỏ nhất khi i nhỏ nhất (bằng 1) và j nhỏ nhất (bằng 1), tức là bằng 2.
(i+ j) lớn nhất khi i lớn nhất (bằng 8) và j lớn nhất (bằng 8), tức là bằng 16.
(i+ j) chạy từ 2 tới 16 có 15 giá trị tức là bàn cờ có 15 đường chéo đi lên (đếm trên
hình vẽ ta cũng thấy bàn cờ có 15 đường chéo đi lên).
Ta dùng mảng b[i + j], (i + j) chạy từ 2 tới 16, để mã sự tự do hay không của
các đường chéo đi lên qua ô (i, j)). Ý nghĩa các giá trị của mảng này như sau: Nếu
b[i+ j] = True thì đường chéo đi lên qua ô (i, j) tự do, ngược lại thì không.
Hoàn toàn tương tự như trên GV sẽ hỏi và SV sẽ đưa ra cách mã hóa đường chéo đi
xuống qua ô (i, j) có tự do hay không như sau:
GV: Làm thế nào để kí hiệu (mã) đường chéo đi xuống qua ô (i, j) có tự do hay
không? Ai có nhận xét về các ô mà đường chéo đi xuống qua ô (i, j) đi qua?
SV: Đường chéo đi xuống qua ô (i, j) là đường chéo đi qua các ô có chỉ số hàng trừ
chỉ số cột bằng nhau và bằng chính (i− j). Mỗi giá trị của hiệu (i− j) tương ứng với một
đường chéo đi xuống.
GV: Ai có thể mã hóa sự kiện đường chéo đi xuống qua ô (i, j) tự do/không tự do?
29
Nguyễn Tân Ân
SV: Dễ thấy rằng:
Hiệu (i− j) nhỏ nhất khi i (số trừ) nhỏ nhất (bằng 1) và j (số bị trừ) lớn nhất (bằng
8), tức là bằng −7.
Hiệu (i− j) lớn nhất khi i (số trừ) lớn nhất (bằng 8) và j (số bị trừ) nhỏ nhất (bằng
1), tức là bằng +7.
(i − j) chạy từ −7 tới +7 có 15 giá trị tức là bàn cờ có 15 đường chéo đi xuống
(đếm trên hình vẽ ta cũng thấy bàn cờ có 15 đường chéo đi xuống).
Ta dùng mảng c[i − j], (i − j) chạy từ −7 tới +7, để lưu sự tự do hay không
của đường chéo đi xuống qua ô (i, j). Ý nghĩa các giá trị của mảng này như sau: Nếu
c[i− j] = True thì đường chéo đi xuống qua ô (i, j) tự do, ngược lại thì không.
GV: Với cách mã như trên câu: Nếu ô (i, j) tự do... được viết thế nào?
SV: Câu: Nếu ((hàng i tự do) và (đường chéo đi lên qua ô (i, j) tự do) và (đường
chéo đi xuống qua ô (i, j) tự do))... bây giờ có thể viết là:
if ((a[i] = True) and (b[i+ j] = True) and (c[i− j] = True)) ...
Hay viết gọn là if(a[i] and b[i+ j] and c[i− j]) ...
GV: Thao tác đặt quân hậu j vào ô (i, j) được viết thế nào?
SV: x[j] := i;
GV (Gợi ý): Tình trạng hàng i, đường chéo đi lên, đường chéo đi xuống qua ô (i, j)
bây giờ thế nào?
SV: Không tự do nữa.
GV (Chốt lại): Ngoài việc gán x[j] := i còn phải ghi lại tình trạng ô (i, j) không tự
do nữa. Ai có thể hoàn chỉnh thao tác đặt quân hậu j vào hàng i trong cột của nó?
SV: Thao tác đặt quân hậu j vào hàng i trong cột j được viết như sau:
x[j] := i;
a[i] := False;
b[i+ j] := False;
c[i− j] := False;
GV: Thao tác cất quân hậu khỏi ô (i, j) được viết thế nào?
SV: Ta chỉ cần đổi trạng thái TỰ DO của ô (i, j) thành trạng thái KHÔNG TỰ DO:
a[i] := True;
b[i+ j] := True;
c[i− j] := True;
Không cần quan tâm đến giá trị của x[j] nữa. Coi x[j] là biến tự do (biến chưa được
gán trị).
GV: Các bạn SV hãy viết lại giải thuật trên bằng cách thay các câu trừu tượng bằng
đoạn mã của nó.
SV (Tự viết).
GV (Chốt lại): Thủ tục như sau:
30
Dạy học giải quyết vấn đề trong giảng dạy phương pháp giải một bài toán trên máy tính ...
procedure Try(j: integer; var q: boolean);;
(*Thử đặt quân hậu j, q là biến Boolean để lưu kết quả*)
1. var i: integer;
2. Begin
3. i := 0; (*Ban đầu gán chỉ số hàng bằng 0*)
4. Repeat
5. i := i+ 1; (*Tăng chỉ số hàng lên 1*)
6. q:= False; (*Trước khi thử, gán biến q bằng False*)
4. if (a[i] and b[i+j] and c[i-j]) (*Nếu ô (i,j) tự do*) then
5. begin (*Đặt quân hậu j vào hàng i trong cột của nó và ghi lại tình
trạng ô (i, j) không còn tự do nữa*)
6. x[j] := i;
7. a[i] := False;
8. b[i+ j] := False;
9. c[i− j] := False;
10. if j < 8 (*Nếu hậu j chưa phải là quân cuối*) then
11. begin
12. Try (j + 1, q); (*Kiểm tra xem việc đặt quân hậu j được
hay không*)
13. if not (q) then (*Nếu không được*)
14. begin (*Cất quân hậu j đi chỉ cần trả lại tình trạng
tự do cho ô (i, j)*)
15. a[i] := True;
15. b[i+ j] := True;
16. c[i− j] := True;
17. end;
18. end else (*Ngược lại không được tức là ĐƯỢC*) q := True;
19. end;
20. Until q (*Cho đến khi ĐƯỢC*) or (i = 8) (*Hoặc đã thử đến hàng cuối*);
21. End;
Viết xong thủ tục, SV thoát khỏi tình huống có vấn đề.
Nếu có thể, GV vừa dẫn dắt SV qua các slide vừa lật màn hình sang PASCAL, mã
hóa đuợc thao tác nào, đánh máy ngay đoạn code đó lên máy để xây dựng dần thủ tục.
Cuối cùng GV đánh máy thêm phần khai báo các biến toàn cục và chương trình chính sau
đó cho chạy ngay tại lớp để SV thấy được kết quả làm việc của trò và thầy vừa rồi là đúng.
Làm được như thế sẽ gây ấn tượng hết sức mạnh mẽ đối với SV. Tuy nhiên, để chương
trình chạy ngay, đưa ra một nghiệm đúng, đòi hỏi GV phải rất tỉnh táo, không được nhầm
dù chỉ lỗi chính tả nhỏ. Tác giả bài báo này đã thử nghiệm vừa phân tích cách mã hóa,
vừa đánh máy chương trình ngay tại lớp (Với SV hệ Cử nhân Sư phạm Tin dùng ngôn ngữ
PASCAL, với sinh viên hệ Cử nhân Công nghệ Thông tin dùng ngôn ngữ C++) và thấy
cả lớp vô cùng hứng thú theo dõi. Chương trình chạy, SV rất phấn khởi. Nếu đem chương
31
Nguyễn Tân Ân
trình có sẵn ra chạy, hiệu quả kém hơn nhiều.
Tác giả bài báo này đã thử nghiệm giảng dạy cho các lớp cử nhân Sư phạm Tin, các
lớp cử nhân Công nghệ Thông tin ở cả hệ chính qui, hệ vừa làm vừa học và nhận thấy:
Nhìn chung SV hứng thú học tập và rất hiểu bài.
GV (Ra bài tập. Tùy theo trình độ của SV, có thể có các mức bài tập sau):
1). Viết (hoặc viết lại nếu GV đã đánh máy chương trình hoàn chỉnh và cho chạy)
chương trình hoàn chỉnh gồm chương trình chính kết hợp với thủ tục trên để máy tính đưa
ra một phương án đặt 8 quân hậu và kiểm thử.
2). Cải tiến giải thuật trên để viết chương trình cho máy tính in ra tất cả các phương
án đặt 8 quân hậu.
3). Từ tính đối xứng của bàn cờ hãy cho biết trong tất cả các phương án tìm được
bởi chương trình trên có bao nhiêu phương án thực sự khác nhau?
4). Đối với những SV có khả năng, giao nhiệm vụ hãy trình bày lời giải trong chế
độ đồ họa (Vẽ bàn cờ và vẽ các quân hậu trên màn hình).
5). Có thể giao bài tập lớn: Viết chương trình trong chế độ đồ họa, mô phỏng hoạt
động của giải thuật trên.
6). Cũng có thể nêu các vấn đề khác như: Chứng minh tính đúng đắn của giải thuật
trên bằng Toán học? Xác định độ phức tạp thời gian của giải thuật trên? Hãy suy nghĩ về
kích thước của bài toán: "Hãy đặt k quân hậu lên bàn cờ kích thước k × k sao cho không
quân nào ăn được quân nào?", k tối thiểu là bao nhiêu để bài toán có nghiệm? Các khả
năng mở rộng kích thước của bàn cờ: Tăng số hàng, tăng số cột, tăng đều số hàng, số cột
và số quân hậu. Khi tăng như vậy độ phức tạp thời gian của giải thuật thay đổi thế nào?
Hãy viết giải thuật không đệ qui để tìm một nghiệm, tìm tất cả các nghiệm của bài toán
Tám Quân Hậu?
3. Kết luận
DH GQVĐ là phương pháp thích hợp với các bài giảng về cách giải một bài toán
trên máy tính. Đây là phương pháp dễ áp dụng và dễ đạt hiệu quả cao khi dạy nội dung
này. Áp dụng phương pháp DH GQVĐ sẽ kích hoạt tính tích cực của SV, tạo điều kiện
cho SV chủ động tìm kiếm tri thức, nâng cao hiệu quả học tập, có điều kiện rèn luyện toàn
diện bản thân. Những cái khó khi áp dụng phương pháp này là GV phải rất hiểu trình độ
của SV, phải nắm rất vững nội dung bài dạy và luôn linh hoạt khéo léo đưa SV vào hoàn
cảnh có vấn đề, giúp họ giải quyết vấn đề để thoát khỏi tình huống đó. Ngoài ra, GV phải
luôn luôn quản lí tốt thời gian và tiến trình giờ giảng. Cuối cùng, GV phải biết kết hợp với
các phương pháp dạy học khác khi cần thiết. Có như vậy mới có thể đạt được những giờ
dạy thành công.
TÀI LIỆU THAM KHẢO
[1] Nguyễn Tân Ân, 2012, Dạy học giải quyết vấn đề trong giảng dạy các phương pháp
giải quyết vấn đề của Trí tuệ nhân tạo. Tạp chí khoa học Trường Đại học Sư phạm Hà
32
Dạy học giải quyết vấn đề trong giảng dạy phương pháp giải một bài toán trên máy tính ...
Nội 5-2012,
[2] Nguyễn Tân Ân, 2012, Dạy học lấy người học làm trung tâm trong đào tạo nguồn
nhân lực công nghệ thông tin và truyền thông. Tạp chí khoa học Trường Đại học Sư
phạm Hà Nội 4-2012.
[3] George F. Fuger & William A. Stubblefield, 2000. Trí tuệ nhân tạo - Các cấu trúc &
chiến lược giải quyết vấn đề (Tập1, Tập 2). (Bản dịch của Bùi Xuân Toại, Trương Gia
Việt). Nxb Thống kê, Hà Nội.
[4] Nguyễn Bá Kim, 2002. Phương pháp giảng dạy Toán. Nxb Đại học Sư phạm, Hà Nội.
[5] Đỗ Xuân Lôi, 2011, Cấu trúc dữ liệu và giải thuật. Nxb Đại học Quốc gia, Hà Nội.
[6] Lê Khắc Thành, 2008. Phương pháp dạy học chuyên ngành (Công nghệ thông tin).
Nxb Đại học Sư phạm, Hà Nội.
ABSTRACT
Teaching problem solving in teaching the resolution of a problem with computer
This article presents a summary of teaching methods to solve the problem, the suit-
ability of this approach in the training of human resources for information and comuni-
cation technology in general and teaching content of solving problem with computer in
particular. This article also provides training scenarios “Eight Queen” with this method
and the test results were available. The test results confirmed that the method of teach-
ing problem solving is positively mobilize students, consistent with the goal of renewing
the current teaching methods and is well suited to teaching content solve a problem with
computer.
33
Các file đính kèm theo tài liệu này:
- 2283_ntan_7336.pdf