1. Trang chủ
  2. » Công Nghệ Thông Tin

Lập trình hàm

227 440 1

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 227
Dung lượng 1,88 MB

Nội dung

T T S S . . P P H H A A N N H H U U Y Y K K H H Á Á N N H H L L ậ ậ p p t t r r ì ì n n h h h h à à m m NHÀ XUẤT BẢN KHOA HỌC VÀ KỸ THUẬT i Mục lục CHƯƠNG I. NGUYÊN LÝ LẬP TRÌNH HÀM 1 I.1 Mở đầu về ngôn ngữ lập trình 1 I.1.1. Vài nét về lịch sử 1 I.1.2. Định nghĩa một ngôn ngữ lập trình 2 I.1.3. Khái niệm về chương trình dịch 4 I.1.4. Phân loại các ngôn ngữ lập trình 5 I.1.5. Ngôn ngữ lập trình mệnh lệnh 7 I.2 Cơ sở của các ngôn ngữ hàm 8 I.2.1. Tính khai báo của các ngôn ngữ hàm 8 I.2.2. Định nghĩa hàm 11 I.2.3. Danh sách 13 I.2.4. Phép so khớp 16 I.2.5. Phương pháp currying (tham đối hoá từng phần) 17 I.2.6. Khái niệm về bậc của hàm 18 I.2.7. Kiểu và tính đa kiểu 20 I.2.8. Tính hàm theo kiểu khôn ngoan 22 I.2.9. Một số ví dụ 25 1. Loại bỏ những phần tử trùng nhau 25 2. Sắp xếp nhanh quicksort 25 3. Bài toán tám quân hậu 26 4. Bài toán hamming 27 I.3 Kết luận 29 CHƯƠNG II. NGÔN NGỮ SCHEME 33 II.1 Giới thiệu Scheme 33 II.2 Các kiểu dữ liệu của Scheme 34 II.2.1. Các kiểu dữ liệu đơn giản 34 II.2.1.1. Kiểu số 34 II.2.1.2. Kiểu lôgích và vị từ 36 II.2.1.3. Ký hiệu 38 II.2.2. Khái niệm về các biểu thức tiền tố 39 II.2.3. S-biểu thức 41 II.3 Các định nghĩa trong Scheme 41 II.3.1. Định nghĩa biến 41 II.3.2. Định nghĩa hàm 42 II.3.2.1. Khái niệm hàm trong Scheme 42 II.3.2.2. Gọi hàm sau khi định nghĩa 43 II.3.2.3. Sử dụng các hàm bổ trợ 44 II.3.2.4. Tính không định kiểu của Scheme 45 ii LẬP TRÌNH HÀM II.3.3. Cấu trúc điều khiển 45 II.3.3.1. Dạng điều kiện if 45 II.3.3.2. Biến cục bộ 47 1. Định nghĩa biến cục bộ nhờ dạng let 47 2. Phạm vi tự động của dạng let 48 3. Liên kết biến theo dãy : dạng let* 48 II.3.3.3. Định nghĩa các vị từ 49 II.3.4. Sơ đồ đệ quy và sơ đồ lặp 50 II.3.4.1. Sơ đồ đệ quy 50 II.3.4.2. Ví dụ 51 1. Tính tổng bình phương các số từ 1 đến n 51 2. Tính giai thừa 51 3. Hàm fibonacci 51 4. Tính các hệ số nhị thức 52 II.3.4.3. Tính dừng của lời gọi đệ quy 52 II.3.4.4. Chứng minh tính dừng 54 II.3.4.5. Sơ đồ lặp 54 II.3.5. Vào/ra dữ liệu 56 1. Đọc vào dữ liệu : read 56 2. In ra dữ liệu : write và display 56 3. Xây dựng vòng lặp có menu 57 CHƯƠNG III. KIỂU DỮ LIỆU PHỨC HỢP 61 III.1 Kiểu chuỗi 61 III.2 Kiểu dữ liệu vectơ 64 III.3 Kiểu dữ liệu bộ đôi 64 III.3.1. Khái niệm trừu tượng hoá dữ liệu 64 III.3.2. Định nghĩa bộ đôi 66 III.3.3. Đột biến trên các bộ đôi 68 III.3.4. Ứng dụng bộ đôi 69 1. Biểu diễn các số hữu tỷ 69 2. Biểu diễn hình chữ nhật phẳng 72 III.4 Kiểu dữ liệu danh sách 74 III.4.1. Khái niệm danh sách 74 III.4.2. Ứng dụng danh sách 76 III.4.2.1. Các phép toán cơ bản cons, list, car và cdr 76 III.4.2.2. Các hàm xử lý danh sách 79 1. Các hàm length, append và reverse 79 2. Các hàm tham chiếu danh sách 80 3. Các hàm chuyển đổi kiểu 81 4. Các hàm so sánh danh sách 83 III.4.2.3. Dạng case xử lý danh sách 84 III.4.2.4. Kỹ thuật đệ quy xử lý danh sách phẳng 86 1. Tính tổng các phần tử của một danh sách 86 2. Danh sách các số nguyên từ 0 đến n 86 3. Nghịch đảo một danh sách 87 4. Hàm append có hai tham đối 87 5. Loại bỏ các phần tử khỏi danh sách 87 6. Bài toán tính tổng con 88 MỤC LỤC iii 7. Lập danh sách các số nguyên tố 88 III.4.2.5. Kỹ thuật đệ quy xử lý danh sách bất kỳ 89 1. Làm phẳng một danh sách 89 2. Tính tổng các số có mặt trong danh sách 90 3. Loại bỏ khỏi danh sách một phần tử ở các mức khác nhau 90 4. Nghịch đảo danh sách 90 5. So sánh bằng nhau 91 III.4.3. Biểu diễn danh sách 92 III.4.3.1. Biểu diễn danh sách bởi kiểu bộ đôi 92 III.4.3.2. Danh sách kết hợp 96 1. Khái niệm danh sách kết hợp 96 2. Sử dụng danh sách kết hợp 97 III.4.3.3. Dạng quasiquote 98 III.4.4. Một số ví dụ ứng dụng danh sách 99 1. Tìm phần tử cuối cùng của danh sách 99 2. Liệt kê các vị trí một ký hiệu có trong danh sách 100 3. Tìm tổng con lớn nhất trong một vector 100 4. Bài toán sắp xếp dãy viên bi ba màu 101 5. Sắp xếp nhanh quicksort 102 CHƯƠNG IV. KỸ THUẬT XỬ LÝ HÀM 107 IV.1 Sử dụng hàm 107 IV.1.1. Dùng tên hàm làm tham đối 107 IV.1.2. Áp dụng hàm cho các phần tử của danh sách 110 IV.1.3. Kết quả trả về là hàm 112 IV.2 Phep tính lambda 113 IV.2.1. Giới thiệu phép tính lambda 113 IV.2.2. Biễu diễn biểu thức lambda trong Scheme 114 IV.2.3. Định nghĩa hàm nhờ lambda 115 IV.2.4. Kỹ thuật sử dụng phối hợp lambda 117 IV.2.5. Định nghĩa hàm nhờ tích luỹ kết quả 120 1. Tính tổng giá trị của một hàm áp dụng cho các phần tử danh sách 120 2. Tính tích giá trị của một hàm áp dụng cho các phần tử danh sách 120 3. Định nghĩa lại hàm append ghép hai danh sách 120 4. Định nghĩa lại hàm map cho hàm một biến h 120 5. Định nghĩa các hàm fold 122 IV.2.6. Tham đối hoá từng phần 122 IV.2.7. Định nghĩa đệ quy cục bộ 123 IV.3 Xử lý trên các hàm 125 IV.3.1. Xây dựng các phép lặp 125 1. Hàm append-map 125 2. Hàm map-select 126 3. Các hàm every và some 126 IV.3.2. Trao đổi thông điệp giữa các hàm 127 IV.3.3. Tổ hợp các hàm 129 IV.3.4. Các hàm có số lượng tham đối bất kỳ 130 IV.4 Một số ví dụ 132 IV.4.1. Phương pháp xấp xỉ liên tiếp 132 IV.4.2. Tạo thủ tục định dạng 133 iv LẬP TRÌNH HÀM IV.4.3. Xử lý đa thức 134 IV.4.3.1. Định nghĩa đa thức 134 IV.4.3.2. Biễu diễn đa thức 134 IV.4.3.3. Xử lý đa thức 135 1. Nhân đa thức với một hằng số 135 2. So sánh hai đa thức 136 3. Phép cộng đa thức 136 4. Phép nhân hai đa thức 137 IV.4.3.4. Biễu diễn trong một đa thức 137 IV.4.3.5. Đưa ra đa thức 138 IV.4.4. Thuật toán quay lui 139 IV.4.4.1. Bài toán tám quân hậu 139 IV.4.4.2. Tìm kiếm các lời giải 140 IV.4.4.3. Tổ chức các lời giải 143 CHƯƠNG V. CẤU TRÚC DỮ LIỆU 147 V.1 Tập hợp 147 1. Phép hợp trên các tập hợp 148 2. Phép giao trên các tập hợp 149 3. Phép hiệu của hai tập hợp 149 4. Tìm các tập hợp con của một tập hợp 150 V.2 Ngăn xếp 150 V.2.1. Kiểu dữ liệu trừu tượng ngăn xếp 150 V.2.2. Xây dựng ngăn xếp 151 V.2.3. Xây dựng trình soạn thảo văn bản 152 V.2.4. Ngăn xếp đột biến 153 V.2.5. Tính biểu thức số học dạng hậu tố 156 V.3 Tệp 158 V.3.1. Cấu trúc dữ liệu trừu tượng kiểu tệp 158 V.3.2. Ví dụ áp dụng tệp 159 V.3.3. Tệp đột biến 160 V.4 Cây 162 V.4.1. Cây nhị phân 163 V.4.1.1. Kiểu trừu tượng cây nhị phân 163 V.4.1.2. Biểu diễn cây nhị phân 164 1. Biểu diễn tiết kiệm sử dụng hai phép cons 164 2. Biểu diễn dạng đầy đủ 165 3. Biểu diễn đơn giản 165 V.4.1.3. Một số ví dụ lập trình đơn giản 166 1. Đếm số lượng các nút có trong một cây 166 2. Tính độ cao của một cây 166 V.4.1.4. Duyệt cây nhị phân 167 V.4.2. Cấu trúc cây tổng quát 169 V.4.2.1. Kiểu trừu tượng cây tổng quát 169 V.4.2.2. Biểu diễn cây tổng quát 169 1. Biểu diễn cây nhờ một bộ đôi 169 2. Biểu diễn cây đơn giản qua các lá 170 V.4.2.3. Một số ví dụ về cây tổng quát 170 MỤC LỤC v 1. Đếm số lượng các nút trong cây 170 2. Tính độ cao của cây 171 V.4.2.4. Duyệt cây tổng quát không có xử lý trung tố 171 V.4.3. Ứng dụng cây tổng quát 172 V.4.3.1. Xây dựng cây cú pháp 172 V.4.3.2. Ví dụ : đạo hàm hình thức 173 CHƯƠNG VI. MÔI TRƯỜNG VÀ CẤP PHÁT BỘ NHỚ 177 VI.1 Môi trường 177 VI.1.1. Một số khái niệm 177 VI.1.2. Phạm vi của một liên kết 178 VI.1.2.1. Phạm vi tĩnh 178 VI.1.2.2. Phép đóng = biểu thức lambda + môi trường 179 VI.1.2.3. Thay đổi bộ nhớ và phép đóng 180 VI.1.2.4. Nhận biết hàm 181 VI.1.2.5. Phạm vi động 182 VI.1.3. Thời gian sống của một liên kết 184 VI.1.4. Môi trường toàn cục 184 VI.2 Cấp phát bộ nhớ 185 VI.2.1. Ví dụ 1 : mô phỏng máy tính bỏ túi 186 VI.2.2. Ví dụ 2 : bài toán cân đối tài khoản 187 VI.3 Mô hình sử dụng môi trường 189 VI.4 Vào/ra dữ liệu 192 VI.4.1. Làm việc với các tệp 192 VI.4.2. Đọc dữ liệu trên tệp 193 1. Các hàm đọc tệp 193 2. Tệp văn bản 195 VI.4.3. Ghi lên tệp 196 1. Các hàm ghi lên tệp 196 2. Lệnh sao chép tệp 197 VI.4.4. Giao tiếp với hệ thống 198 PHỤ LỤC 203 TÀI LIỆU THAM KHẢO 205 7 LỜI NÓI ĐẦU uốn sách này trình bày cơ sở lý thuyết và những kỹ thuật lập trình cơ bản theo phong cách «lập trình hàm» (Functional Programming). Đây là kết quả biên soạn từ các giáo trình sau nhiều năm giảng dạy bậc đại học và sau đại học ngành công nghệ thông tin của tác giả tại Đại học Đà Nẵng. Cuốn sách gồm sáu chương có nội dung như sau : − Chương 1 giới thiệu quá trình phát triển và phân loại các ngôn ngữ lập trình, những đặc điểm cơ bản của phong cách lập trình mệnh lệnh. Phần chính của chương trình bày nhữngnguyên lý lập trình hàm sử dụng ngôn ngữ minh hoạ Miranda. − Chương 2 trình bày những kiến thức mở đầu về ngôn ngữ Scheme : các khái niệm và các kiểu dữ liệu cơ sở, cách định nghĩa hàm, biểu thức, kỹ thuật sử dụng đệ quy và phép lặp. − Chương 3 trình bày các kiểu dữ liệu phức hợp của Scheme như chuỗi, vectơ, danh sách và cách vận dụng các kiểu dữ liệu trừu tượng trong định nghĩa hàm. − Chương 4 trình bày những kiến thức nâng cao về kỹ thuật lập trình hàm, định nghĩa hàm nhờ phép tính lambda, ứng dụng thuật toán quay lui, truyền thông điệp − Chương 5 trình bày chi tiết hơn kỹ thuật lập trình nâng cao với Scheme sử dụng các cấu trúc dữ liệu : tập hợp, ngăn xếp, hàng đợi, cây và tệp. − Chương 6 trình bày khái niệm môi trường, cách tổ chức và cấp phát bộ nhớ, cách vào/ra dữ liệu của Scheme với thế giới bên ngoài. − Phần phụ lục giới thiệu vắn tắt ngôn ngữ lập trình WinScheme48, hướng dẫn cách cài đặt và sử dụng phần mềm này. Cuốn sách này làm tài liệu t khảo cho sinh viên các ngành công nghệ thông tin và những bạn đọc muốn tìm hiểu thêm về kỹ thuật lập trình cho lĩnh vực trí tuệ nhân tạo, giao tiếp hệ thống, xử lý ký hiệu, tính toán hình thức, các hệ thống đồ hoạ Trong suốt quá trình biên soạn, tác giả đã nhận được từ các bạn đồng nghiệp nhiều đóng góp bổ ích về mặt chuyên môn, những động viên khích lệ về mặt tinh thần, sự giúp đỡ tận tình về biên tập để cuốn sách được ra đời. Do mới xuất bản lần đầu tiên, tài liệu tham khảo chủ yếu là tiếng nước ngoài, chắc chắn rằng nội dung của cuốn sách vẫn còn bộc lộ nhiều thiếu sót, nhất là các thuật ngữ dịch ra tiếng Việt. Tác giả xin được bày tỏ ở đây lòng biết ơn sâu sắc về mọi ý kiến phê bình đóng góp của bạn đọc gần xa. Đà Nẵng, ngày 06/09/2004 Tác giả. C P P H H A A N N H H U U Y Y K K H H Á Á N N H H L L Ậ Ậ P P T T R R Ì Ì N N H H H H À À M M F F u u n n c c t t i i o o n n a a l l P P r r o o g g r r a a m m m m i i n n g g ập trình hàm là phong cách lập trình dựa trên định nghĩa hàm sử dụng phép tính lambda (λ-calculus). Lập trình hàm không sử dụng các lệnh gán biến và không gây ra hiệu ứng phụ như vẫn gặp trong lập trình mệnh lệnh. Trong các ngôn ngữ lập trình hàm, hàm (thủ tục, chương trình con) đóng vai trò trung tâm, thay vì thực hiện lệnh, máy tính tính biểu thức. Đã có rất nhiều ngôn ngữ hàm được phát triển và ứng dụng như Miranda, Haskell, ML, các ngôn ngữ họ Lisp : Scheme, Common Lisp Phần đầu cuốn sách này trình bày cơ sở lý thuyết và những khái niệm cơ bản của lập trình hàm sử dụng ngôn ngữ minh hoạ là Miranda, một ngôn ngữ thuần tuý hàm do D. Turner đề xuất 1986. Phần chính trình bày kỹ thuật lập trình hàm trong Scheme, một ngôn ngữ do Guy Lewis Steele Jr. và G. Jay Sussman đề xuất 1975. Ngôn ngữ Scheme có tính sư phạm cao, giải quyết thích hợp các bài toán toán học và xử lý ký hiệu. Scheme có cú pháp đơn giản, dễ học, dễ lập trình. Một chương trình Scheme là một dãy các định nghĩa hàm góp lại để định nghĩa một hoặc nhiều hàm phức tạp hơn. Scheme làm việc theo chế độ thông dịch, tương tác với người sử dụng. Cuốn sách này rất thích hợp cho sinh viên các ngành công nghệ thông tin và những bạn đọc muốn tìm hiểu về kỹ thuật lập trình ứng dụng trong lĩnh vực trí tuệ nhân tạo, giao tiếp người-hệ thống, xử lý ký hiệu, tính toán hình thức, thiết kế các hệ thống đồ hoạ VỀ TÁC GIẢ : Tốt nghiệp ngành Toán Máy tính năm 1979 tại trường Đại học Bách khoa Hà Nội. Từ 1979 đến nay giảng dạy tại khoa Công nghệ Thông tin, trường Đại học Bách khoa, Đại học Đà Nẵng. Bảo vệ tiến sĩ năm 1991 tại Pháp. Giữ chức chủ nhiệm khoa Công nghệ Thông tin 1995-2000. Hướng nghiên cứu chính : xử lý ngôn ngữ, xử lý đa ngữ, lý thuyết tính toán. E-mail: phanhuykhanh@dng.vnn.vn L [...]... ngôn ng l p trình hàm, c hai bi u th c trên luôn có cùng giá tr Do các hàm không ph thu c nhi u vào các bi n toàn c c, nên vi c l p trình hàm s d hi u hơn l p trình m nh l nh Ví d gi s m t trình biên d ch c n t i ưu phép tính : f(x) + f(x) thành : 2 * f(x) Khi ó, trình biên d ch m t ngôn ng hàm luôn luôn xem hai k t qu là m t, do có tính nh t quán trong k t qu tr v c a hàm Tuy nhiên, m t trình biên... p trình hàm, các l i g i chương trình con ư c vi t thành bi u th c r t ơn gi n : (print (process-data (get-data ( )))) NGUYÊN LÝ L P TRÌNH HÀM 9 Các ngôn ng hàm là cũng các ngôn ng b c cao, mang tính tr u tư ng hơn so v i các ngôn ng m nh l nh Nh ng ngư i l p trình hàm thư ng tránh s d ng các bi n toàn c c, trong khi ó, h u h t nh ng ngư i l p trình m nh l nh u ph i s d ng n bi n toàn c c Khi l p trình. .. chương trình d ch B i vì vi c d ch m t chương trình h p ng ra ngôn ng máy ơn gi n hơn nhi u Hi n nay, ngư i ta cũng vi t các chương trình d ch b ng chính các ngôn ng b c cao ho c các công c chuyên d ng Thông thư ng có hai lo i chương trình d ch, hay hai ch d ch, là trình biên d ch và trình thông d ch, ho t ng như sau : • Trình biên d ch (compilater) d ch toàn b chương trình ngu n thành chương trình. .. i sau ó m i b t u ti n hành th c hi n chương trình ích Trình thông d ch (interpreter) d ch l n lư t t ng câu l nh m t c a chương trình ngu n r i ti n hành th c hi n luôn câu l nh ã d ch ó, cho t i khi th c hi n xong toàn b chương trình Có th hi u trình biên d ch là d ch gi , trình thông d ch là thông d ch viên • NGUYÊN LÝ L P TRÌNH HÀM 5 Nh ng ngôn ng l p trình c p cao ch biên d ch hay g p là : Fortran,... không trình bày y cú pháp c a Miranda mà ch qua các ví d c a Miranda minh ho các y u t thu n tuý hàm c a l p trình hàm Ví d sau ây la m t chương trình Miranda ơn gi n Chú ý c p ký hi u || m t dòng chú thích c a Miranda u || z = sq(x)/sq(y) = x2/y2 || sq(n) = n2 z = sq x / sq y sq n = n * n x = a + b y = a - b a = 10 b = 5 I.2.2 b t nh nghĩa hàm Hàm là khái ni m cơ b n trong các ngôn ng hàm M t hàm có... hai, ngư i ta có th lư ng t hoá các v t Trong các ngôn ng hàm, hàm luôn luôn ư c x lý như nh ng i tư ng ư c truy n tham i tr v k t qu và ư c lưu gi trong các c u trúc d li u M t hàm nh n m t hàm khác như là m t tham i ư c g i là hàm b c cao Các hàm b c cao mang l i tính hi u qu và là n n t ng (corner-stone) c a l p trình hàm hi u b n ch t c a m t hàm b c cao, ngư i c có th t tìm giá tr k t qu c a answer... ngôn ng l p trình Các ngôn ng l p trình cũng ư c phân lo i theo th h như sau : • Th h 1 : ngôn ng máy • Th h 2 : h p ng • Th h 3 : ngôn ng th t c • Th h 4 : ngôn ng áp d ng hay hàm • Th h 5 : ngôn ng suy di n hay d a logic • Th h 6 : m ng nơ-ron (neural networks) NGUYÊN LÝ L P TRÌNH HÀM 7 Trư c khi nghiên c u l p các ngôn ng l p trình hàm, ta c n nh c l i m t s c a l p các ngôn ng l p trình m nh l... effect) do có th làm thay i bi n toàn c c − M t chương trình ư c xây d ng theo b n m c : kh i (block), chương trinh con, ơn th (module/packages) và chương trình I.2 Cơ s c a các ngôn ng hàm I.2.1 Tính khai báo c a các ngôn ng hàm Trong các ngôn ng m nh l nh, m t chương trình thư ng ch a ba l i g i chương trình con (th t c, hàm) liên quan n quá trình ưa vào d li u, x lý d li u và ưa ra k t qu tính toán... toán, chương trình ch y luôn luôn d ng, n nh và cho k t qu phù h p v i yêu c u t ra ban u I.1.3 Khái ni m v chương trình d ch Chương trình ư c vi t trong m t ngôn ng l p trình b c cao, ho c b ng h p ng , u ư c g i là chương trình ngu n (source program) B n thân máy tính không hi u ư c các câu l nh trong m t chương trình ngu n Chương trình ngu n ph i ư c d ch (translate) thành m t chương trình ích (target... trình v i các ngôn ng hàm, ngư i l p trình ph i nh nghĩa các hàm toán h c d suy lu n, d hi u mà không c n quan tâm chúng ư c cài t như th nào trong máy Nh ng ngư i theo khuynh hư ng l p trình hàm cho r ng các l nh trong m t chương trình vi t b ng ngôn ng m nh l nh làm thay i tr ng thái toàn c c là hoàn toàn b t l i B i vì r t nhi u ph n khác nhau c a chương trình (ch ng h n các hàm, các th t c) tác . EDISCIENCE international, Paris 1994. [10] Phan Huy Khánh. Giáo trình lập trình hàm. Giáo trình xuất bản nội bộ, Đại học Đà Nẵng 2002. [11] Phan Huy Khánh & Phan Chí Tùng. Nhập môn Tin học. Nhà. mức của ngôn ngữ lập trình. Những năm gần đây, ngôn ngữ lập trình được phát triển theo phương thức lập trình (còn được gọi là phong cách hay kiểu lập trình) . Một phương thức lập trình có thể được. thiệu quá trình phát triển và phân loại các ngôn ngữ lập trình, những đặc điểm cơ bản của phong cách lập trình mệnh lệnh. Phần chính của chương trình bày nhữngnguyên lý lập trình hàm sử dụng

Ngày đăng: 08/06/2014, 15:23

Xem thêm

TỪ KHÓA LIÊN QUAN

w