Sáng kiến kinh nghiệm THPT: Giúp học sinh tiếp cận với phương pháp quy hoạch động bằng một số bài toán đơn giản trong Tin học
lượt xem 8
download
Nội dung sáng kiến được trình bày logic, phù hợp với trình độ phát triển tư duy của học sinh từ nhận biết, thông hiểu đến vận dụng, nâng cao và sáng tạo qua đó giúp cho học sinh phát triển tư duy tổng hợp và rèn luyện các kĩ năng viết chương trình sử dụng phương pháp quy hoạch động.
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Sáng kiến kinh nghiệm THPT: Giúp học sinh tiếp cận với phương pháp quy hoạch động bằng một số bài toán đơn giản trong Tin học
- MỤC LỤC CÁC KÝ HIỆU VIẾT TẮT TRONG SÁNG KIẾN KINH NGHIỆM .......................... 3 I. Lời giới thiệu............................................................................................................... 4 II. Tên sáng kiến: ............................................................................................................ 5 III. Tác giả sáng kiến:..................................................................................................... 5 IV. Chủ đầu tư tạo ra sáng kiến:..................................................................................... 5 V. Lĩnh vực áp dụng sáng kiến: ..................................................................................... 5 VI. Ngày sáng kiến được áp dụng lần đầu hoặc áp dụng thử: ....................................... 5 VII. Mô tả bản chất của sáng kiến: ................................................................................ 5 PHẦN I: SƠ ĐỒ NỘI DUNG SÁNG KIẾN KINH NGHIỆM ................................ 6 PHẦN II: NỘI DUNG SÁNG KIẾN KINH NGHIỆM ............................................. 7 I. Một số khái niệm cơ bản về phương pháp quy hoạch động ............................... 7 1.1. Khái niệm .................................................................................................... 7 1.2. Các bước giải quyết bài toán bằng phương pháp quy hoạch động. ............ 7 II. So sánh phương pháp quy hoạch động với các phương pháp khác ................ 11 2.1. Phương pháp quy hoạch động và phương pháp đệ quy ............................ 11 2.2. Phương pháp quy hoạch động và phương pháp vét cạn ........................... 15 III. Cài đặt chương trình cho một số bài toán đơn giản thường gặp .................... 15 Ví dụ 1: Bài toán tính an (n là số nguyên dương). ........................................... 16 Ví dụ 2: Tính n! (n là số nguyên dương) ......................................................... 18 Ví dụ 3: Dãy số fibonacci: ............................................................................... 20 Ví dụ 4: Bài toán tháp Hà Nội.......................................................................... 22 Ví dụ 5: Bài toán cái túi ................................................................................... 24 IV. Bài tập tự giải ................................................................................................. 29 Bài toán 1: Dãy con có tổng bằng S ................................................................ 29 Bài toán 2: Dãy con có tổng lớn nhất............................................................... 29 Bài toán 3: Chia kẹo ......................................................................................... 30 VIII. Những thông tin cần bảo mật: Không ................................................................. 30 1
- IX. Các điều kiện cần thiết để áp dụng sáng kiến: Học sinh đội tuyển Tin học lớp 10, 11, 12. ........................................................................................................................... 30 X. Đánh giá lợi ích thu được hoặc dự kiến có thể thu được do áp dụng sáng kiến theo ý kiến của tác giả: ............................................................................................................ 30 XI. Danh sách những tổ chức/cá nhân đã tham gia áp dụng thử hoặc áp dụng sáng kiến lần đầu: ......................................................................................................................... 32 TÀI LIỆU THAM KHẢO ............................................................................................ 33 2
- CÁC KÝ HIỆU VIẾT TẮT TRONG SÁNG KIẾN KINH NGHIỆM Ký hiệu Ý nghĩa SKKN Sáng kiến kinh nghiệm THPT Trung học phổ thông ĐQ Đệ quy DQ Đệ quy QHĐ Quy hoạch động QHD Quy hoạch động PP Phương pháp NXB Nhà xuất bản 3
- BÁO CÁO KẾT QUẢ NGHIÊN CỨU, ỨNG DỤNG SÁNG KIẾN I. Lời giới thiệu Hiện nay, công nghệ thông tin xuất hiện ở mọi nơi, sự phát triển nhanh chóng của nó giúp cuộc sống của con người trở nên tốt đẹp hơn. Công nghệ thông tin giúp các nhà khoa học tạo ra những nghiên cứu vượt bậc nhờ việc tính toán và xử lý một khối lượng công việc khổng lồ của máy tính. Chúng có thể thực hiện hàng tỷ phép tính trong vài giây. Rất nhiều phần mềm ra đời nhằm giúp con người giải quyết công việc dễ dàng hơn. Các phần mềm được viết nhờ các Lập trình viên dựa trên các ngôn ngữ lập trình và Pascal là một ngôn ngữ lập trình giúp những người mới học lập trình dễ tiếp cận. Tại các trường Trung học phổ thông hiện nay, nhiệm vụ quan trọng là đào tạo một cách toàn diện đồng thời chú trọng bồi dưỡng năng lực của học sinh. Chính vì vậy một trong những tiêu chí đánh giá chất lượng giáo dục của trường THPT là kết quả của việc thực hiện hoạt động bồi dưỡng học sinh giỏi. Đối với mỗi giáo viên THPT, bồi dưỡng học sinh giỏi là một nhiệm vụ quan trọng và khó khăn. Nó đòi hỏi giáo viên phải tìm hiểu, học tập rất nhiều kiến thức về chuyên ngành và các phương pháp giảng dạy thích hợp. Đối với giáo viên bộ môn Tin học, bồi dưỡng học sinh giỏi đòi hỏi giáo viên phải hiểu biết về lập trình và cần có các phương pháp giảng dạy thuật toán tốt giúp học sinh dễ dàng tiếp thu và vận dụng. Học sinh muốn đạt kết quả cao trong kỳ thi học sinh giỏi tỉnh và cao hơn cần phải có lượng kiến thức lớn và sâu trong việc lập trình. Những kiến thức này đối với chương trình phổ thông bình thường là không đủ đáp ứng. Nhiệm vụ của giáo viên là cung cấp thêm cho các em kiến thức, phương pháp lập trình để học sinh đạt kết quả tốt trong kỳ thi. Có nhiều phương pháp được dùng để thiết kế thuật toán như: Đệ quy (Recursion), quy hoạch động (Dynamic programming), chia để trị (Divide and conquer), vét cạn (Exhaustivesearch), tham lam (Greedy algorithms) ... Trong đó, mỗi thuật toán chỉ áp dụng cho những lớp bài toán phù hợp. Trong ngành khoa học máy tính, đệ quy là chìa khóa để thiết kế nhiều giải thuật quan trọng và cũng là cơ sở của quy hoạch động (Dynamic Programming). Quy hoạch động là một phương pháp giảm thời gian chạy của các thuật toán thể hiện các tính chất của các bài toán con gối nhau (Overlapping subproblem) và cấu trúc con tối ưu (Optimal substructure). Phương pháp quy hoạch động là một phương pháp hiệu quả trong việc giải bài toán tối ưu hoá rời rạc. Có một số bài toán sử dụng phương pháp quy hoạch động lại cho hiệu quả cao hơn so với các phương pháp khác. Trong các kỳ thi học sinh giỏi tỉnh và cao hơn hiện nay, từ 30% đến 40% các bài thi cần đến quy hoạch động và đây là những bài toán khó, đòi hỏi học sinh phải có tư duy lập trình cao. Có thể có những cách khác để giải bài toán đó. Nhưng vì các bài thi đều có xét đến thời gian thực hiện (chạy) chương trình, cũng như dung lượng bộ nhớ để lưu trữ và thực hiện chương trình đó. Nên một thuật toán hiệu quả là cực kỳ cần thiết. Có nghĩa là cùng một bài toán, cách nào mà thời 4
- gian thực hiện càng nhanh, chiếm ít bộ nhớ hơn sẽ được đánh giá cao hơn. Và trong những trường hợp như vậy, quy hoạch động là một trong những thuật toán phù hợp. Chỉ cần làm được những bài này là học sinh gần như có giải. Tuy nhiên, các em thường hay bị nhầm lẫn và khó phân biệt được khi thuật toán sử dụng phương pháp quy hoạch động và các phương pháp khác. Nên việc làm cho các em học sinh phổ thông có thể phân biệt và thấy được sự ưu việt của quy hoạch động từ đó sử dụng thành thạo phương pháp này trong lập trình không phải là vấn đề dễ dàng. Hiểu rõ các thuật toán là bước đầu giúp các em học sinh tự tin đồng thời phân tích bài toán và xác định phương pháp giải đúng đắn sẽ giúp các em có thành tích tốt hơn. Là một giáo viên giảng dạy bộ môn Tin học ở trường trung học phổ thông, sau nhiều năm tham gia dạy bồi dưỡng đội tuyển thi học sinh giỏi, tôi nhận thấy việc bồi dưỡng học sinh giỏi là nhiệm vụ vô cùng quan trọng và việc ứng dụng phương pháp quy hoạch động trong thiết kế thuật toán là một mảng kiến thức rất cần thiết đối với học sinh tham gia đội tuyển học sinh giỏi môn Tin học. Vì vậy tôi chọn đề tài “Giúp học sinh tiếp cận với phương pháp quy hoạch động bằng một số bài toán đơn giản trong Tin học” làm đề tài nghiên cứu. Hy vọng đây sẽ là một tư liệu hữu ích cho các giáo viên, học sinh và những người quan tâm đến phần kiến thức này. II. Tên sáng kiến: Giúp học sinh tiếp cận với phương pháp quy hoạch động bằng một số bài toán đơn giản trong Tin học. III. Tác giả sáng kiến: - Họ và tên: Nguyễn Thị Hà - Địa chỉ tác giả sáng kiến: Xã Đại Đồng – huyện Vĩnh Tường – tỉnh Vĩnh Phúc - Số điện thoại: 0977 212 636 - E_mail: nguyenthiha.gvnguyenvietxuan@vinhphuc.edu.vn IV. Chủ đầu tư tạo ra sáng kiến: Nguyễn Thị Hà V. Lĩnh vực áp dụng sáng kiến: Dạy bồi dưỡng học sinh đội tuyển Tin học, giáo viên hoặc những người quan tâm tới lập trình. VI. Ngày sáng kiến được áp dụng lần đầu hoặc áp dụng thử: Năm 2017 – 2018. VII. Mô tả bản chất của sáng kiến: 5
- PHẦN I: SƠ ĐỒ NỘI DUNG SÁNG KIẾN KINH NGHIỆM 6
- PHẦN II: NỘI DUNG SÁNG KIẾN KINH NGHIỆM I. Một số khái niệm cơ bản về phương pháp quy hoạch động 1.1. Khái niệm * Quy hoạch động (Dynamic Programming) là một phương pháp rất hiệu quả giải nhiều bài toán tin học, đặc biệt là những bài toán tối ưu. * Quy hoạch động trong ngành khoa học máy tính: Là một phương pháp giảm thời gian chạy của các thuật toán thể hiện các tính chất của các bài toán con gối nhau (Overlapping subproblem) và cấu trúc con tối ưu (Optimal substructure). Phương pháp quy hoạch động bắt đầu từ việc giải tất cả các bài toán nhỏ nhất (bài toán cơ sở) để từ đó từng bước giải quyết những bài toán lớn hơn cho tới khi giải được bài toán lớn nhất (bài toán ban đầu). Ý tưởng cơ bản của phương pháp quy hoạch động là tránh tính toán lại các bài toán con đã xét, nói cách khác phương pháp quy hoạch động đã thể hiện sức mạnh của nguyên lý chia để trị đến cao độ. * Một bài toán P muốn giải bằng phương pháp quy hoạch động cần có 2 đặc điểm sau: - Bài toán P thỏa mãn nguyên lý tối ưu Bellman, nghĩa là có thể sử dụng lời giải tối ưu của các bài toán con từ mức thấp nhất để tìm dần lời giải tối ưu cho bài toán con ở mức cao hơn và cuối cùng là lời giải tối ưu cho bài toán P. - Bài toán P có các bài toán con phủ chồng lên nhau, nghĩa là không gian bài toán con “hẹp” không tạo dạng hình cây. 1.2. Các bước giải quyết bài toán bằng phương pháp quy hoạch động. - Bước 1: Xây dựng hàm mục tiêu Áp dụng nguyên lý tối ưu của Bellman ta phân rã bài toán ban đầu thành các bài toán con có cùng cấu trúc sao cho việc giải quyết bài toán con cấp i phụ thuộc vào kết quả của các bài toán con trước đó. Cụ thể hóa bước này là ta phải xây dựng được hàm mục tiêu F(i) là nghiệm của bài toán con cấp i. - Bước 2: Xác định các bài toán cơ sở. Bài toán cơ sở là các bài toán con nhỏ nhất mà ta có thể biết ngay kết quả hoặc tính được kết quả dễ dàng. Đây chính là cơ sở để tính nghiệm cho các bài toán cấp lớn hơn. - Bước 3: Xây dựng công thức truy hồi 7
- Căn cứ vào ý nghĩa của hàm mục tiêu, tìm mối quan hệ giửa các bài toán con các cấp, ta tiến hành xây dựng công thức tính kết quả của bài toán cấp i dựa vào kết quả của các bài toán con cấp trước đó. - Bước 4: Lập bảng phương án Sử dụng công thức truy hồi và nghiệm các bài toán cơ sở tính nghiệm tất cả các bài toán con và lưu trữ chúng vào bảng phương án. - Bước 5: Kết luận nghiệm của bài toán. Dựa vào bảng phương án chỉ ra nghiệm của bài toán. Các bước giải quyết trên tuy rất cụ thể nhưng vẫn trừu tượng đối với học sinh. Bài toán 1: Tính an (n là số nguyên dương) - Bước 1: Hàm mục tiêu: f(i) là lũy thừa của ai - Bước 2: Các bài toán cơ sở: f(0) = 1; - Bước 3: Công thức truy hồi: f(i) = a* f(i-1) - Bước 4: Bảng phương án i 0 1 2 3 4 5 6 ….. …. f(i) 1 a a*a1 a*a2 a*a3 a*a4 a*a5 - Bước 5: Nghiệm f(n) của bài toán Bài toán 2: Tính n! - Bước 1: Hàm mục tiêu: f(i) là giai thừa của số i - Bước 2: Các bài toán cơ sở: f(0) = 1; f(1) = 1 - Bước 3: Công thức truy hồi: f(i) = i* f(i-1) - Bước 4: Bảng phương án i 0 1 2 3 4 5 6 ….. …. f(i) 1 1 2*1= 2 3*2=6 4*6 = 24 5*24 = 120 6*120=720 - Bước 5: Nghiệm F(n) của bài toán Bài toán 3: Tìm số Fibonaci thứ N? - Bước 1: Hàm mục tiêu: f(i) là số fibonaci thứ i. - Bước 2: Các bài toán cơ sở: f(0) = 1; f(1) = 1 - Bước 3: Công thức truy hồi: f(i) = f(i-1) + f(i-2) 8
- - Bước 4: Bảng phương án i 1 2 3 4 5 6 7 ….. …. f(i) 1 1 2 3 5 8 13 - Bước 5: Nghiệm f(n) của bài toán Bài toán 4: Tháp Hà Nội Chuyển n chiếc đĩa từ cọc 1 sang cọc 2 theo thứ tự từ lớn đến nhỏ. có sử dụng cọc 3 làm cọc trung gian. Mỗi lần di chuyển được 1 đĩa. Và đĩa đĩa lớn phải ở dưới đĩa nhỏ. - Bước 1: Hàm mục tiêu: f(i) - Bước 2: Các bài toán cơ sở: f(1): = 1 - Bước 3: Công thức truy hồi: f(i):=2*f(i-1)+1 - Bước 4: Bảng phương án i 1 2 3 4 5 ….. …. f(i) 1 3 7 15 31 - Bước 5: Nghiệm f(n) của bài toán Bài toán 5: Bài toán cái túi Trong siêu thị có n gói hàng (n
- Cơ sở quy hoạch động: Dễ thấy F[0, j] = giá trị lớn nhất có thể bằng cách chọn trong số 0 gói = 0. - Bước 4: Bảng phương án Ta xây dựng bảng phương án dựa trên công thức truy hồi trên. Để kiểm tra kết quả có chính xác hay không (nếu không chính xác chúng ta xây dựng lại hàm mục tiêu). Thông qua cách xây dựng hàm mục tiêu và bảng phương án chúng ta sẽ định hướng việc truy vết. * Trường hợp mỗi vật được chọn 1 lần N/M 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 4 2 0 0 2 2 2 2 2 2 2 2 2 2 4 4 6 6 3 0 1 2 3 3 3 3 3 3 3 3 3 4 5 6 7 4 0 2 3 4 5 5 5 5 5 5 5 5 5 6 7 8 5 0 2 3 4 10 12 13 14 15 15 15 15 15 15 15 15 Vậy ta có thể chọn vật 2, 3, 4, 5 * Trường hợp mỗi vật được chọn nhiều lần N/M 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 4 2 0 0 2 2 4 4 6 6 8 8 10 10 12 12 14 14 3 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 4 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 5 0 2 4 6 10 12 14 16 20 22 24 26 30 32 34 36 Vậy chúng ta có thể chọn vật 4 (3 lần) và vật 5 (3 lần) - Bước 5: Truy vết: * Trường hợp 1: Trong bảng phương án F[n,m] chính là giá trị lớn nhất thu được khi chọn trong cả n vật với giới hạn trọng lượng là M. 10
- Nếu f[n,M]=f[n-1,M] thì tức là không chọn vật thứ n, ta truy về f[n-1,M]. Còn nếu f[n,M]≠f[n-1,M] thì ta thông báo rằng phép chọn tối ưu có chọn vật thứ n và truy về f[n-1,M-Wn]. * Trường hợp 2: Trong bảng phương án F[n,m] chính là giá trị lớn nhất thu được khi chọn trong cả n vật với giới hạn trọng lượng là M. Nếu f[n,M] = f[n-1,M] thì tức là không chọn vật thứ n, ta truy về f[n-1,M]. Còn nếu f[n,M] ≠ f[n-1,M] thì ta thông báo rằng phép chọn tối ưu có chọn vật thứ n và truy về f[n,M-Wn]. II. So sánh phương pháp quy hoạch động với các phương pháp khác 2.1. Phương pháp quy hoạch động và phương pháp đệ quy Về mặt nguyên tắc phương pháp quy hoạch động rất giống với phương pháp đệ quy. * Giống nhau: Cả hai phương pháp đều sử dụng lời giải của các bài toán có kích thước bé hơn, đồng dạng với bài toán ban đầu để đưa ra lời giải của bài toán ban đầu. * Khác nhau: Quy hoạch động Đệ quy - Gọi thực hiện các bài toán cả hai chiều: - Gọi thực hiện các bài toán có kích Từ trên xuống (top - down) hoặc từ dưới thước lớn trước rồi đến các bài toán có lên (bottom - up). kích thước bé hay thực hiện các bài toán từ trên xuống (top - down) - Các kết quả trung gian được lưu lại, khi - Các kết quả trung gian không được giải các bài toán lớn hơn chỉ cần cần lấy ra lưu lại nên khi cần dùng đến phải tính không cần tính toán lại. đi tính lại nhiều lần. - Dành phần lớn bộ nhớ để lưu trữ các kết - Dùng phần lớn bộ nhớ để lưu trữ quả trung gian. chương trình con. - Tốn ít bộ nhớ hơn và thời gian thực hiện - Chiếm dung lượng bộ nhớ rất lớn, nhanh hơn thông thường độ phức tạp là hàm mũ. Trong hầu hết các bài toán thì quy hoạch động chiếm ưu thế hơn đệ quy nhưng trong một vài trường hợp cả hai bài toán thực hiện đều như nhau. Ta xét một số ví dụ cả về quy hoạch động và đệ quy để thấy được tính ưu việt của quy hoạch động. Ví dụ 1: Bài toán tính an (n là số nguyên dương) Quy hoạch động Đệ quy 11
- var n,i,a:longint; var n, a:longint; f:array[0..100] of int64; function lthua(a,n:longint):int64; function lthua(a,n:longint):int64; begin begin if n =0 then lthua:=1 f[0]:=1; else lthua:=a*lthua(a,n-1); for i:=1 to n do f[i]:=a*f[i-1]; end; lthua:=f[i]; end; * Nhận xét: * Nhận xét: - Ta xây dựng mảng f chứa các giá trị - Khi chúng ta gọi hàm lthua(n,a) trong trung gian nên khi cần dùng đến chỉ cần chương trình chính thì ở trong con sẽ lấy ở trong f ra không cần phải tính lại. gọi hàm lthua(n-1) và lthua(n-2) Nên chương trình thực hiện sẽ nhanh hơn, - Rồi để gọi hàm lthua(n-1) thì lại phải không tốn bộ nhớ. gọi hàm lthua(n-2) và lthua(n-3) … cứ như vậy các hàm sẽ bị gọi lặp lại rất nhiều lần. - Như vậy trong bài này khi ta dùng đệ quy để giải bài toán. Mỗi lần muốn dùng lại hàm nào thì nó gọi lại hàm đó nên sẽ tốn nhiều bộ nhớ Ví dụ 2: Tính n! 1 n0 Ta có định nghĩa như sau: n! = nếu n *(n 1)! n0 Cho một số nguyên dương n (0 < n < 13). Quy hoạch động Đệ quy var n,i:longint; var n:longint; f:array[0..100] of int64; function gt(n:longint):int64; function gt(n:longint):int64; begin begin 12
- f[0]:=1; if n
- để tìm lời giải của các bài toán ở mức cao hơn. Ví dụ 4: Bài toán tháp Hà Nội Chuyển n chiếc đĩa từ cọc 1 sang cọc 2 theo thứ tự từ lớn đến nhỏ. có sử dụng cọc 3 làm cọc trung gian. Mỗi lần di chuyển được 1 đĩa. Và đĩa đĩa lớn phải ở dưới đĩa nhỏ. Quy hoạch động Đệ quy var n,i:longint; var n,i:longint; f:array[0..100] of longint; function thaphanoi(n:longint):longint; function thaphanoi(n:longint):longint; begin begin if n = 1 then exit(1) f[1]:=1; else exit (2*thaphanoi(n-1)+1); for i:= 2 to n do f[i]:=2*f[i-1]+1; end; thaphanoi:=f[i]; end; Ví dụ 5: Bài toán cái túi Trong siêu thị có n gói hàng (n
- if (j>=w[i]) and (f[i- s:=s+v[f[i1]]; 1,j-w[i]]+v[i]>c[i,j]) then s1:=s1+w[f[i1]]; f[i,j]:=f[i-1,j- if s1>m then exit; w[i]]+v[i]; end; end; if s>max then max:=s; end; end; 2.2. Phương pháp quy hoạch động và phương pháp vét cạn Quy hoạch động Vét cạn - Quy hoạch động là tìm một kĩ - Vét cạn là một trong những thuật toán giải bài thuật tìm kết quả trước thông qua toán tối ưu một kết quả có sẵn hoặc được tìm - Thuật toán vét cạn là thuật toán tìm phương án thấy tối ưu của bài toán bằng cách lựa chọn một phương án trong tập hợp tất cả các phương án của bài toán để tìm ra phương án tối ưu. Trong nhiều bài toán, không gian các phương án quá lớn. Vét cạn giúp tìm ra kết quả tối ưu nhưng độ phức tạp lớn, thường là hàm mũ trong khi phương pháp quy hoạch động độ phức tạp là đa thức. Do vậy, khi áp dụng thuật toán vét cạn không đảm bảo về thời gian cũng như kĩ thuật. Vét cạn là xét toàn bộ trường hợp, rồi tìm ra kết quả. - Ưu điểm là chạy rất nhanh - Ưu điểm của vét cạn là chắc chắn tìm ra lời giải (nếu có) - Nhược điểm của nó là có thể chạy quá lâu, vượt - Nhược điểm của nó là rất khó mức thời gian cho phép tìm ra thuật toán, với một số bài toán có thể sẽ không có thuật toán Chú ý: Vét cạn theo nghĩa thông thường là xét quy hoạch động. hết mọi đối tượng hay mọi trường hợp. Trong lập trình, vét cạn là phương pháp được dùng khi không còn phương pháp nào hiệu quả hơn có thể sử dụng được. III. Cài đặt chương trình cho một số bài toán đơn giản thường gặp Vì trong đề tài chỉ nói đến những bài toán đơn giản nên thường là những bài toán dễ tìm ra phương pháp giải và phương pháp giải thường dùng là đệ quy hoặc quy hoạch 15
- động. Nên phần ví dụ trong SKKN này mỗi bài toán tôi chỉ xin phép đề cập đến mối tương quan giữa hai phương pháp là đệ quy và quy hoạch động. Tức là trong phần chương trình của từng bài tôi thường có thêm biến “đếm” để đếm số lần lặp thực hiện trong từng bài khi chạy cùng số test để người học có thể thấy được cái nào hay, cái nào ngắn hơn. Giúp người học dể hiểu, dễ phân biệt và rút ra được cái hay và cái chưa hay của quy hoạch động trong từng bài toán. Ví dụ 1: Bài toán tính an (n là số nguyên dương). Cách xác định bài toán - Input: a, n - Output: giá trị an Ý tưởng của bài toán - Ta thấy n = 0 thì f(0) =1 n = 1 thì f(1) = a n = 2 thì f(2) = f(1)*a n = 3 thì f(3) = f(2)*a ….. n = i thì f(i) = f(i-1)*a - Trong bài toán này có giá trị chặn là n = 0 Cài đặt chương trình Phương pháp QHĐ Phương pháp ĐQ uses crt; uses crt; var n,i,a,dem:longint; var n,a,dem:longint; g:text; f:text; f:array[0..100] of int64; function lthua(a,n:longint):int64; function lthua(a,n:longint):int64; begin begin dem:=dem+1; f[0]:=1; if n =0 then lthua:=1 for i:=1 to n do else lthua:=a*lthua(a,n-1); begin end; f[i]:=a*f[i-1]; BEGIN 16
- dem:=dem+1; clrscr; end; dem:=0; lthua:=f[i]; assign(f,'nhap.inp'); reset(f); end; //write('nhap a,n:=') ; readln(a,n); BEGIN readln(f,a,n); clrscr; close(f); assign(g,'nhap.inp'); reset(g); assign(f,'xuat.out'); rewrite(f); dem:=0; lthua(a,n); //write('nhap a,n:=');readln(a,n); writeln(f,'KQ BT luy thua thuc hien readln(g,a,n); bang pp DE QUY la:'); close(g); writeln(f,'so lan lap la:=',dem); lthua(a,n); write(f,'luy thua la:=',lthua(a,n)); assign(g,'xuat.out'); rewrite(g); close(f); writeln(g,'KQ BT lthua thuc hien END. bang pp QHD la:'); writeln(g,'so lan lap la:=',dem); write(g,'lthua la:=',lthua(a,n)); close(g); END. Chạy thử chương trình 17
- * Nhận xét: Qua phần chạy thử bộ test 210 ta thấy chương trình chạy bằng quy hoạch động số lần lặp là 10. Còn chương trình chạy bằng đệ quy số lần lặp lại bằng 11. Số lần lặp sử dụng phương pháp QHĐ ít hơn sử dụng phương pháp ĐQ 1 lần. Ví dụ 2: Tính n! (n là số nguyên dương) Cách xác định bài toán - Input: n - Output: giá trị giai thừa của n Ý tưởng của bài toán - Ta thấy n = 0 thì f(0) =1 n = 1 thì f(1) = 1 n = 2 thì f(2) = f(1)*2 n = 3 thì f(3) = f(2)*3 ….. n = i thì f(i) = f(i-1)*i - Trong bài toán này có hai giá trị chặn là n = 0 và n = 1 Cài đặt chương trình Phương pháp QHĐ Phương pháp ĐQ Uses crt; Uses crt; var n,i,dem:longint; var dem,n:longint; g:text; f:text; f:array[0..100] of int64; function gthua(n:longint):int64; function gthua(n:longint):int64; begin begin dem:=dem+1; f[1]:=1; if n
- exit(f[n]); //write('nhap n:='); readln(n); end; assign(f,'nhap.inp'); reset(f); BEGIN readln(f,n); clrscr; close(f); dem := 1; assign(f,'xuat.out'); rewrite(f); //write('nhap n:='); readln(n); gthua(n) ; //n := 15; writeln(f,'KQ BT tinh GIAI THUA assign(g,'nhap.inp'); reset(g); bang PP DE QUY la:'); readln(g,n); writeln(f,'So lap la:=',dem); close(g); writeln(f,'Giai thua cua ',n,' co gia tri la:=',GTHUA(n)); assign(g,'xuat.out'); close(f); rewrite(g); END. gthua(n) ; writeln(g,'KQ BT tinh GIAI THUA bang PP QHD la:'); writeln(g,'So lan lap la:=',dem); writeln(g,'Giai thua cua so ',n,' co gia tri la:=',gthua(n)); close(g); END. Chạy thử chương trình 19
- * Nhận xét: Ta chạy thử với test bằng 5 thì số lần lặp của hai phương pháp trên là như nhau, đều lặp lại 5 lần. Ta thấy rằng trong trường hợp này phương pháp quy hoạch động không hơn gì phương pháp đệ quy. Ví dụ 3: Dãy số fibonacci: Tính số hạng thứ n của dãy fibonacci bằng phương pháp đệ quy. Trong đó chuỗi có giá trị như sau: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ... Cách xác định bài toán - Input: n - Output: giá trị fibonacci của n Ý tưởng của bài toán - Ta thấy n = 0 thì f(0) =1 n = 1 thì f(1) = 1 n = 2 thì f(2) = f(1) + f(0) n = 3 thì f(3) = f(2) + f(1) ….. n = i thì f(i) = f(i-1) + f(i-2) - Trong bài toán này có hai giá trị chặn là n = 0 và n = 1 Cài đặt chương trình Phương pháp QHĐ Phương pháp ĐQ uses crt; uses crt; var n,i,a,dem:longint; var n,i,dem:longint; f:array[0..100] of longint; f:text; g:text; function dq(n:longint):int64; function qhd(n:longint):int64; begin begin dem:=dem+1; f[0]:=1; f[1]:=1; if n
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Sáng kiến kinh nghiệm THPT: Bộ ngữ pháp ôn thi tốt nghiệp môn tiếng Anh dạng khung
53 p | 57 | 10
-
Sáng kiến kinh nghiệm THPT: Hướng dẫn học sinh lớp 12 trường THPT Yên Định 3 giải nhanh bài toán trắc nghiệm cực trị của hàm số
29 p | 34 | 9
-
Sáng kiến kinh nghiệm THPT: Sử dụng sơ đồ phân bố thời gian giúp học sinh giải nhanh bài tập trắc nghiệm liên quan đến thời điểm và khoảng thời gian trong mạch dao động
24 p | 25 | 9
-
Sáng kiến kinh nghiệm THPT: Rèn kỹ năng cảm thụ văn xuôi Việt Nam hiện đại trong chương trình Ngữ văn 12
27 p | 38 | 9
-
Sáng kiến kinh nghiệm THPT: Các dạng câu hỏi của bài đọc điền từ thi THPT Quốc gia
73 p | 31 | 7
-
Sáng kiến kinh nghiệm THPT: Một vài kinh nghiệm hướng dẫn ôn thi học sinh giỏi Địa lí lớp 12
20 p | 21 | 7
-
Sáng kiến kinh nghiệm THPT: Sử dụng sơ đồ tư duy giúp học sinh lớp 12 trường THPT Trần Đại Nghĩa làm bài kiểm tra đạt hiệu quả cao
41 p | 56 | 7
-
Sáng kiến kinh nghiệm THPT: Vận dụng toán tổ hợp xác suất trong việc giúp học sinh giải nhanh các bài tập di truyền phần sinh học phân tử và biến dị đột biến
17 p | 40 | 7
-
Sáng kiến kinh nghiệm THPT: Phương pháp thử và đặc biệt hóa trong giải toán trắc nghiệm
32 p | 17 | 7
-
Sáng kiến kinh nghiệm THPT: Giúp học sinh lớp 12 nâng cao năng lực viết đoạn văn nghị luận xã hội trong kì thi Trung học phổ thông quốc gia
38 p | 32 | 6
-
Sáng kiến kinh nghiệm THPT: Một số kinh nghiệm rèn kĩ năng viết đoạn văn nghị luận xã hội cho học sinh lớp 12 ở trường THPT Vĩnh Linh
20 p | 15 | 5
-
Sáng kiến kinh nghiệm THPT: Nâng cao hiệu quả dạy - học qua việc tích hợp nội dung ứng phó với biến đổi khí hậu trong bài 14 và 15 Địa lí 12
32 p | 32 | 5
-
Sáng kiến kinh nghiệm THPT: Hướng dẫn học sinh lớp 12 ôn tập môn Lịch Sử theo định hướng 5 bước 1 vấn đề, đáp ứng yêu cầu mới của kỳ thi THPT Quốc gia
29 p | 35 | 5
-
Sáng kiến kinh nghiệm THPT: Giúp học sinh trung bình và yếu ôn tập và làm tốt câu hỏi trắc nghiệm chương 1 giải tích 12
25 p | 25 | 5
-
Sáng kiến kinh nghiệm THPT: Phương pháp dạy giúp học sinh nhớ kiến thức ngữ pháp để làm tốt bài tập
24 p | 28 | 3
-
Sáng kiến kinh nghiệm THPT: Các giải pháp khắc phục một số thiếu sót nhằm nâng cao kết quả việc học toán ở trung học phổ thông
31 p | 30 | 3
-
Sáng kiến kinh nghiệm THPT: Sử dụng phương pháp Grap trong dạy học hóa học 10 nhằm rèn luyện tư duy cho học sinh THPT
14 p | 45 | 3
-
Sáng kiến kinh nghiệm THPT: Giúp học sinh giải tốt các bài toán phương trình, bất phương trình mũ và lôgarit có chứa tham số
37 p | 43 | 2
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn