Với sự kiểm chứng thực nghiệm của máy tính nhiều định lý toán học đã được chứng minh, điển hình trong số đó là bài toán 4 màu (Mọi bản đồ phẳng đều có thể tô được bởi 4 màu sao cho hai vùng có chung biên giới được tô bởi hai màu khác nhau). Chứng minh bài toán này lúc ra đời là một chứng minh hoàn toàn độc đáo đã gây biết bao ngạc nhiên cho rất nhiều người. Bởi một điều đáng lưu ý, chúng ta không thể hiểu được bằng những tư duy và lập luận logic thông thường. Như vậy, giải quyết các bài toán nhờ vào sự trợ giúp của máy tính là một điều không có gì là mới lạ. Kể từ năm 1976 - 1977, khi bài toán 4 màu hoàn toàn được chứng minh nhờ vào sự giúp đỡ của máy tính đến nay đã trải quađược 30 năm. Tuy nhiên chương trình giáo dục môn toán của chúng ta, đặc biêt là ở bậc phổ thông lại hoàn toàn chưa chú ý đến dạng tư duy cực kỳ quan trọng này. Những điều bất cập đó, sẽ được tôi trình bày kỹ qua bài toán thi đại học sau đây: Bài toán 1 Tìm số nguyên dương n sao cho: Cn0+ 2Cn1 + 4Cn2 + … + 2n Cnn= 243. (Đề thi tuyển sinh đại học, cao đẳng năm 2002) Lời giải bằng tư duy toán học của bài toán này đã được đăng nhiều trên các phương tiện thông tin đại chúng, tôi sẽ không trình bày lại nữa. Ở đây tôi xin đưa ra cách hoàn toàn khác, cách giải bằng phương pháp lập trình. Đặt T =Cn0 + 2Cn1+ 4Cn2 + … + 2nCnn Ta thấy rằng: 2n Cnn= 2n, mà với n ³ 8 thì tổng T =Cn0+ 2Cn1 + 4Cn2 + … + 2n Cnn> 2nCnn = 2n ³ 28 = 256 > 243. Vậy chắc chắn n sẽ là số nguyên dương bé hơn 8. Từ đây ta đi tới thuật toán: 1.n = 1 2.Trong khi n < 8 thì 2.1. s = 0 2.2. Cho i chạy từ 0 đến n 2.3. s = s + 2i * Cni 2.4. Nếu s = 243 thì Số cần tìm là n. 2.5. Ngược lại Đây không phải là số cần tìm. 2.6 Tăng n lên 1. 3.Quay lại bước 2. 4.Kết thúc thuật toán . Bây giờ, ta sẽ viết chương trình hoàn chỉnh cho nó. Bạn đọc hoàn toàn có thể sử dụng các ngôn ngữ lập trình như PASCAL, VISUAL BASIC,… riêng ở đây tôi sử dụng ngôn ngữ lập trình C++, môt ngôn ngữ đang rất được ưa dùng trên thế giới hiện nay. Chương trình 1 #include #include #include const k=243; int TH(int m, int k); void main() {clrscr(); int n=1; cout<<"CHUONG TRINH GIAI TOAN THI DAI HOC BANG PHUONG PHAPLAP TRINH" ; cout<<"
Nguoi lap trinh: Nguyen Ngoc Giang
"; cout<<"
DE TOAN:
"; cout<<"
Tim so nguyen duong n sao cho: C(n,0)+2C(n,1)+...+pow(2,n)*C(n,n)= 243
"; cout<<"
LOI GIAI:
"; while(n<8) {int s=0; cout<<"
so n la: "< for(int i=0; i<=n;i++) s+=pow(2,i)*TH(n,i); cout<<"
Tong sau khi tinh la: "< if (s==k) cout<<"
SO CAN TIM CHINH LA SO NAY
"; elsecout<<"
Day khong phai la so duong can tim.
"; n++; } getch(); } int TH(int m, int k) { if (k<0||k>m) return 0; if(k==0 || k==m) return 1; else return TH(m-1,k-1)+TH(m-1,k); } Và đây là kết quả sau khi chạy chương trình trên máy: ------------------------------------------------------------------------------------------------------------ CHUONG TRINH GIAI TOAN THI DAI HOC BANG PHUONG PHAP LAP TRINH Nguoi lap trinh: Nguyen Ngoc Giang DE TOAN: Tim so nguyen duong n sao cho: C(n,0)+2C(n,1)+...+pow(2,n)*C(n,n)= 243 LOI GIAI: so n la: 1 Tong sau khi tinh la: 3 Day khong phai la so duong can tim. so n la: 2 Tong sau khi tinh la: 9 Day khong phai la so duong can tim. so n la: 3 Tong sau khi tinh la: 27 Day khong phai la so duong can tim. so n la: 4 Tong sau khi tinh la: 81 Day khong phai la so duong can tim. so n la: 5 Tong sau khi tinh la: 243 SO CAN TIM CHINH LA SO NAY so n la: 6 Tong sau khi tinh la: 729 Day khong phai la so duong can tim. so n la: 7 Tong sau khi tinh la: 2187 Day khong phai la so duong can tim. ------------------------------------------------------------------------------------------------------------ Trên đây là chương trình và lời giải khi chạy trên máy. Còn khi đi thi, ta sẽ phải làm bài trên giấy. Lẽ dĩ nhiên, cũng giống nhưcách ta giải toán thông thường, ta cũng cần phải đưa ra được lập luận và kết quả mà bài toán yêu cầu để hoàn toàn thuyết phục được mọi người. Do đó, ta giải bài toán 1 bằng phương pháp lập trình viết trên giấy như sau: ------------------------------------------------------------------------------------------------------------ . Ta giải bài toán bằng phương pháp lập trình #include #include #include const k=243; int TH(int m, int k); void main() {clrscr(); int n=1; cout<<"CHUONG TRINH GIAI TOAN THI DAI HOC BANG PHUONG PHAPLAP TRINH" ; cout<<"
DE TOAN:
"; cout<<"
Tim so nguyen duong n sao cho: C(n,0)+2C(n,1)+...+pow(2,n)*C(n,n)= 243
"; cout<<"
LOI GIAI:
"; while(n<8) {int s=0; cout<<"
so n la: "< for(int i=0; i<=n;i++) s+=pow(2,i)*TH(n,i); cout<<"
Tong sau khi tinh la: "< if (s==k) cout<<"
SO CAN TIM CHINH LA SO NAY
"; elsecout<<"
Day khong phai la so duong can tim.
"; n++; } getch(); } int TH(int m, int k) { if (k<0||k>m) return 0; if(k==0 || k==m) return 1; else return TH(m-1,k-1)+TH(m-1,k); } Kết luận : Sau khi chạy chương trình trên máy, ta sẽ biết được số cần tìm là 5. ---------------------------------------------------------------------------------------------------------- Việc lập trình đúng chắc chắn sẽ tìm ra nghiệm nếu chạy chương trình trên máy, nhưng làm thế nào để tìm đúng được nghiệm bằng 5 nếu chỉ viết chương trình trên giấy? Như vậy, cái khó khăn tiếp theo của việc viết chương trình trên giấy ngoài phần lập luận ra, đó là tìm ra kết quả. Thật vậy, ta hoàn toàn có thể tìm được nghiệm nguyên dương n = 5 chỉ bằng không quá 3 phép thử. Cách tìm nghiệm nguyên dương n dưới đây sẽ được làm giống như cách làm của phương pháp tìm số gà và số chó hay cũng giống như cách tìm kiếm nhị phân trong tin học (Xem [1]). Ta biết rằng, vì 0 £n < 8 nên ta chia khoảng trên ra làm hai phần 0 £ n£ 4 và 4 < n < 8. Nếu tại n = 4 ta thu được tổng T < 243 thì chắc chắn 4 < n < 8, ngược lại thì 0 £ n £ 4. Và ta lặp lại quá trình này cho đến khi tìm ra nghiệm. Sau đây là các phép thử: Lần 1n = 4 T(n=4): T = C40+ 2C41 + 4C42 + 8 C43+ 16C44= 1 + 8 + 24 + + 32 + 16 = 81 < 243. Do đó nghiệm n sẽ nằm trong khoảng 4 < n < 8. Lần 2n = 6 T(n = 6): T = C60+ 2C61 + 4C62 + 8C63+16C64 + 32C65 +64C66> 16 C64 + 64C66= 16*15 + 64 = 304 > 243. Vậy 4 < n < 6. Do đó, nếu có nghiệm thì nghiệm đó chính là n =5. Lần 3n = 5 T(n=5): T = C50+ 2C51 + 4 C52 + 8C53+ 16C54 + 32C55 = 1 + 10 + 40 + 80 +80 + 32= 243 Đây chỉ là một cách tìm ra nghiệm nguyên dương n. Bạn đọc có thể làm bất cứ cách nào, miễn là thu được kết quả n = 5 để ghi vào phần kết luận của cách giải ở trên là được. Tôi đã trình bày với các bạn hoàn chỉnh lời giải của bài toán 1 bằng phương pháp lập trình (Cả lập luận cũng như kết quả). Sau đây tôi xin có đôi điều cần bàn: 1. Phương pháp lập trình từ lâu đã được coi như là một phương pháp hữu hiệu giúp giải quyết các bài toán toán học. Có những bài toán toán học chỉ có thể nhờ vào phương pháp lập trình mới có thể giải quyết được. Điển hình nhất trong số đó là bài toán 4 màu mà ta đã nhắc ở trên. Một bài toán khó đến mức mà trước khi giải được hoàn toàn nhờ chạy chương trình trên máy thì không có bất cứ người nào thành công trong việc chứng minh nó. 2. Sự kết hợp hài hòa giữa người và máy làm cho toán học có thêm một tư duy mới và tư duy này đã được thời gian công nhận coi như là một tư duy không thể thiếu trong cách tiếp cận toán học ngày nay. Mặc dù, những nhà toán học mà chưa từng được tiếp xúc với lập trình sẽ có một số nghi ngại. Bởi lẽ, tư duy toán học theo phương pháp lập trình là một tư duy hoàn toàn mới lạ so với những tư duy toán học thông thường khác. Để hiểu và công nhận nó cũng cần những hiểu biết cơ bản về lĩnh vực lập trình cũng như khả năng đánh giá chúng. 3. Một điều đáng chú ý là, ở bậc phổ thông có nhiều em học sinh có khả năng lập trình rất tốt. Liệu kì thi đại học sắp tới đây, khi có một bài toán có khả năng lập trình được như bài toán 1 thì việc chấm điểm cho những cách giải này sẽ như thế nào? Đâu là thang điểm cho những cách giải như thế này? 4. Thêm một thực tế nữa là, có rất nhiều thầy cô giáo dạy toán vì điều kiện không cho phép nên chưa được tiếp xúc với lập trình. Do đó, nếu xảy ra việc giải toán bằng phương pháp lập trình như trường hợp tương tự nói trên thì việc chấm thi sẽ vô cùng khó khăn đối với họ. 5. Chương trình sách giáo khoa toán hiện nay không hề có bất cứ một trang viết nào viết về dạng tư duy phi toán (tư duy lập trình chỉ là một dạng tư duy của tư duy phi toán) áp dụng vào việc giải các bài toán toán học. Liệu đây có phải là một vấn đề thiếu sót cần xem xét hay không? 6. Tư duy toán học ngày nay rõ ràng có sự khác biệt với tư duy toán học của 100 năm về trước. Sự phát triển như vũ bão của khoa học công nghệ kéo theo những luồng tư duy mới xuất hiện. Cho nên chương trình giáo dục toán ở bậc phổ thông của chúng ta cũng cần phải có những thay đổi để phù hợp hơn với thực tế. 7. Những câu hỏi cũng như những nhận xét trên không hề đơn giản để có thể trả lời được trong ngày một ngày hai. Chúng ta cần phải xem xét kỹ hơn về vấn đề này để có được câu trả lời xác đáng nhất. Hy vọng sẽ nhận được những lời chia sẻ của các bạn. Sau cùng là một số bài tập: Bài toán 2: a. Giải bài toán thi đại học sau bằng phương pháp lập trình: Tính giá trị của biểu thức M = (An+14+ 3An3)(n+1)! , biết rằng Cn+22 + 2Cn+22 + 2Cn+32+ Cn+42 = 149 (n là số nguyên dương, Anklà số chỉnh hợp chập k của n phần tử và Cnk là số tổ hợp chập k của n phần tử). (Đề thi tuyển sinh đại học,cao đẳng năm 2005) b. Lập trình giải bài toán 1 bằng các phương pháp khác . Chúc các bạn thành công./. (Nguyễn Ngọc Giang - Cử Nhân Sư Phạm Toán -Sinh viên lớp 04 B - Khoa Ngữ Văn Anh- Đại Học Khoa Học Xã Hội Và Nhân Văn Thành Phố Hồ chí Minh)
School@net (Theo THNT)
|