Tìm hiểu ngôn ngữ bằng các ví dụ thực hành
Số trang: 8
Loại file: pdf
Dung lượng: 125.08 KB
Lượt xem: 12
Lượt tải: 0
Xem trước 2 trang đầu tiên của tài liệu này:
Thông tin tài liệu:
Các hàm, các dãy số và các phép bao hàm Bài toán đầu tiên của Dự án Euler mà bạn sẽ giải quyết là Bài toán 6 (xem phần Tài nguyên), trong đó yêu cầu bạn tính toán tổng các bình phương của các số tự nhiên đầu tiên, bình phương của tổng các số đó và sau đó đưa ra hiệu của chúng. Với bài toán này, bạn sẽ sử dụng Vòng lặpĐọc-Tính toán-In ra (REPL - Read-Evaluate-Print-Loop) của CoffeeScript. Liệt kê 1 hiển thị mã và kết quả đầu ra tương ứng từ phiên làm việc của REPL....
Nội dung trích xuất từ tài liệu:
Tìm hiểu ngôn ngữ bằng các ví dụ thực hành Tìm hiểu ngôn ngữ bằng các ví dụ thực hànhCác hàm, các dãy số và các phép bao hàmBài toán đầu tiên của Dự án Euler mà bạn sẽ giải quyết là Bài toán 6 (xem phần Tài nguyên),trong đó yêu cầu bạn tính toán tổng các bình phương của các số tự nhiên đầu tiên, bình phươngcủa tổng các số đó và sau đó đưa ra hiệu của chúng. Với bài toán này, bạn sẽ sử dụng Vòng lặp-Đọc-Tính toán-In ra (REPL - Read-Evaluate-Print-Loop) của CoffeeScript. Liệt kê 1 hiển thị mãvà kết quả đầu ra tương ứng từ phiên làm việc của REPL.Liệt kê 1. Bài toán 6 từ REPLcoffee> square = (x) -> x*x[Function]coffee> sum = (nums) -> nums.reduce (a,b) -> a+b[Function]coffee> diff = (nums) -> (square sum nums) - (sum nums.map square)[Function]coffee> diff [1..100]25164150Giải thích chi tiết: 1. Trong REPL, ta định nghĩa một hàm. (Như đã đề cập trong Phần 1, CoffeeScript đề cao bản chất lập trình hàm của JavaScript, loại bỏ nhiều cú pháp giống C của JavaScript đã làm cho cú pháp CoffeeScript trở nên dễ nhìn và dễ lập trơ hơn). Ví dụ trong Liệt kê 1 định nghĩa một hàm tên là square (bình phương) và nói rằng nó nhận một tham số duy nhất và trả về tích của phép nhân tham số đó với chính nó (bình phương nó lên). Rồi REPL cho bạn biết rằng bạn đã định nghĩa một hàm. 2. Định nghĩa một hàm khác tên là sum (tổng số) nhận một tham số duy nhất: một mảng. Sau đó hàm Sum gọi phương thức reduce (thu gọn) trên mảng đó. Phương thức reduce là hàm có sẵn của JavaScript (được thêm vào trong JavaScript 1.8). Phương thức reduce tương tự như hàm reduce trong Python hoặc hàm fold (gấp) trong Haskell hoặc Scala. Nó lấy một hàm và di chuyển từ trái sang phải trên mảng đó, áp dụng hàm cho giá trị được trả về trong lần tính trước đó và giá trị tiếp theo trong mảng. Cú pháp hàm cô đọng của CoffeeScript làm cho phương thức reduce dễ sử dụng. Trong trường hợp này, hàm được chuyển sang hàm reduce được quy định là (a,b) -> a + b. Đây là một hàm nhận hai giá trị và cộng chúng với nhau, do đó làm cho tất cả các phần tử của mảng được cộng với nhau. 3. Tạo một hàm tên là diff (hiệu), nó lấy một mảng các số, tính toán hai biểu thức con, rồi trừ chúng cho nhau. Biểu thức con đầu tiên chuyển mảng tới hàm sum, rồi lấy kết quả và chuyển nó tới hàm square. CoffeeScript cho phép bạn bỏ qua các dấu ngoặc đơn trong nhiều trường hợp vì thế không có sai sót nào. Ví dụ, square sum nums tương đương với square(sum(nums)). Biểu thức con thứ hai gọi phương thức map (ánh xạ) của mảng, đó là một phương thức JavaScript 1.8 khác nhận một hàm khác làm đầu vào của nó. Sau đó nó áp dụng hàm đó cho từng thành viên của mảng, tạo ra một mảng mới từ các kết quả. Ví dụ trong Liệt kê 1 sử dụng hàm bình phương làm tham số đầu vào cho hàm map, cung cấp cho bạn một mảng có các phần tử của mảng là các số bình phương của mảng đầu vào. Sau đó, bạn chỉ cần chuyển mảng này tới hàm sum để nhận được tổng của các số bình phương. 4. Chuyển mảng các số thích hợp vào hàm diff để giải Bài toán 6, khi sử dụng một dãy số [1..100]. Dãy số này tương đương với một mảng của tất cả các số từ 1 đến 100, bao gồm cả số 100. Nếu bạn đã muốn dải số này không bao gồm cả số 100 bạn phải viết [1...100], tức là dùng ba dấu chấm thay vì chỉ có hai. Việc chuyển mảng này vào hàm diff cung cấp cho bạn lời giải cho Bài toán 6.Hãy quay trở lại một chút và xem xét Bài toán 1 của Dự án Euler (xem phần Tài nguyên), trongđó yêu cầu bạn tính tổng tất cả các số nguyên nhỏ hơn 1000 có thể chia hết cho 3 hoặc 5. Bạn cóthể nghĩ rằng đây sẽ là bài toán đơn giản nhất trong số các bài toán của Dự án Euler. Bạn có thểdễ dàng giải nó chỉ bằng cách sử dụng các hàm và các dãy số, như trong Bài toán 6. Tuy nhiên,với tính năng phép bao hàm của CoffeeScript, bạn có thể đưa ra lời giải ngắn gọn trong Liệt kê 2.Liệt kê 2. Giải Bài toán 1 bằng cách sử dụng các phép bao hàm (comprehensions)coffee> (n for n in [1..999] when n % 3== 0 or n % 5 == 0).reduce (x,y) -> x+y233168Thật dễ chịu khi có thể giải một bài toán chỉ bằng một dòng mã duy nhất và cú pháp cô đọng củaCoffeeScript cho phép nó trở thành ngôn ngữ một dòng lệnh. Lời giải trong Liệt kê 2 sẽ tạo mộtdanh sách tất cả các số nguyên là bội số của 3 hoặc 5 bằng cách sử dụng một phép bao hàm.Danh sách được tạo ra bằng cách bắt đầu với dãy số [1..999] nhưng chỉ sử dụng các giá trị chiahết cho 3 hoặc 5. Sau đó sử dụng một hàm reduce khác để tính tổng các giá trị đó. REPL tínhtoán một dòng mã này và in ra lời giải cho bài toán đó.Phần tiếp theo, chúng ta sẽ giải các bài toán phức tạp hơn một chút và tiếp tục khám pháCoffeeScript.Về đầu trangCác câu lệnh khối, các mảng và các tệpBài toán 4 của Dự án Euler (xem phần Tài nguyên) ...
Nội dung trích xuất từ tài liệu:
Tìm hiểu ngôn ngữ bằng các ví dụ thực hành Tìm hiểu ngôn ngữ bằng các ví dụ thực hànhCác hàm, các dãy số và các phép bao hàmBài toán đầu tiên của Dự án Euler mà bạn sẽ giải quyết là Bài toán 6 (xem phần Tài nguyên),trong đó yêu cầu bạn tính toán tổng các bình phương của các số tự nhiên đầu tiên, bình phươngcủa tổng các số đó và sau đó đưa ra hiệu của chúng. Với bài toán này, bạn sẽ sử dụng Vòng lặp-Đọc-Tính toán-In ra (REPL - Read-Evaluate-Print-Loop) của CoffeeScript. Liệt kê 1 hiển thị mãvà kết quả đầu ra tương ứng từ phiên làm việc của REPL.Liệt kê 1. Bài toán 6 từ REPLcoffee> square = (x) -> x*x[Function]coffee> sum = (nums) -> nums.reduce (a,b) -> a+b[Function]coffee> diff = (nums) -> (square sum nums) - (sum nums.map square)[Function]coffee> diff [1..100]25164150Giải thích chi tiết: 1. Trong REPL, ta định nghĩa một hàm. (Như đã đề cập trong Phần 1, CoffeeScript đề cao bản chất lập trình hàm của JavaScript, loại bỏ nhiều cú pháp giống C của JavaScript đã làm cho cú pháp CoffeeScript trở nên dễ nhìn và dễ lập trơ hơn). Ví dụ trong Liệt kê 1 định nghĩa một hàm tên là square (bình phương) và nói rằng nó nhận một tham số duy nhất và trả về tích của phép nhân tham số đó với chính nó (bình phương nó lên). Rồi REPL cho bạn biết rằng bạn đã định nghĩa một hàm. 2. Định nghĩa một hàm khác tên là sum (tổng số) nhận một tham số duy nhất: một mảng. Sau đó hàm Sum gọi phương thức reduce (thu gọn) trên mảng đó. Phương thức reduce là hàm có sẵn của JavaScript (được thêm vào trong JavaScript 1.8). Phương thức reduce tương tự như hàm reduce trong Python hoặc hàm fold (gấp) trong Haskell hoặc Scala. Nó lấy một hàm và di chuyển từ trái sang phải trên mảng đó, áp dụng hàm cho giá trị được trả về trong lần tính trước đó và giá trị tiếp theo trong mảng. Cú pháp hàm cô đọng của CoffeeScript làm cho phương thức reduce dễ sử dụng. Trong trường hợp này, hàm được chuyển sang hàm reduce được quy định là (a,b) -> a + b. Đây là một hàm nhận hai giá trị và cộng chúng với nhau, do đó làm cho tất cả các phần tử của mảng được cộng với nhau. 3. Tạo một hàm tên là diff (hiệu), nó lấy một mảng các số, tính toán hai biểu thức con, rồi trừ chúng cho nhau. Biểu thức con đầu tiên chuyển mảng tới hàm sum, rồi lấy kết quả và chuyển nó tới hàm square. CoffeeScript cho phép bạn bỏ qua các dấu ngoặc đơn trong nhiều trường hợp vì thế không có sai sót nào. Ví dụ, square sum nums tương đương với square(sum(nums)). Biểu thức con thứ hai gọi phương thức map (ánh xạ) của mảng, đó là một phương thức JavaScript 1.8 khác nhận một hàm khác làm đầu vào của nó. Sau đó nó áp dụng hàm đó cho từng thành viên của mảng, tạo ra một mảng mới từ các kết quả. Ví dụ trong Liệt kê 1 sử dụng hàm bình phương làm tham số đầu vào cho hàm map, cung cấp cho bạn một mảng có các phần tử của mảng là các số bình phương của mảng đầu vào. Sau đó, bạn chỉ cần chuyển mảng này tới hàm sum để nhận được tổng của các số bình phương. 4. Chuyển mảng các số thích hợp vào hàm diff để giải Bài toán 6, khi sử dụng một dãy số [1..100]. Dãy số này tương đương với một mảng của tất cả các số từ 1 đến 100, bao gồm cả số 100. Nếu bạn đã muốn dải số này không bao gồm cả số 100 bạn phải viết [1...100], tức là dùng ba dấu chấm thay vì chỉ có hai. Việc chuyển mảng này vào hàm diff cung cấp cho bạn lời giải cho Bài toán 6.Hãy quay trở lại một chút và xem xét Bài toán 1 của Dự án Euler (xem phần Tài nguyên), trongđó yêu cầu bạn tính tổng tất cả các số nguyên nhỏ hơn 1000 có thể chia hết cho 3 hoặc 5. Bạn cóthể nghĩ rằng đây sẽ là bài toán đơn giản nhất trong số các bài toán của Dự án Euler. Bạn có thểdễ dàng giải nó chỉ bằng cách sử dụng các hàm và các dãy số, như trong Bài toán 6. Tuy nhiên,với tính năng phép bao hàm của CoffeeScript, bạn có thể đưa ra lời giải ngắn gọn trong Liệt kê 2.Liệt kê 2. Giải Bài toán 1 bằng cách sử dụng các phép bao hàm (comprehensions)coffee> (n for n in [1..999] when n % 3== 0 or n % 5 == 0).reduce (x,y) -> x+y233168Thật dễ chịu khi có thể giải một bài toán chỉ bằng một dòng mã duy nhất và cú pháp cô đọng củaCoffeeScript cho phép nó trở thành ngôn ngữ một dòng lệnh. Lời giải trong Liệt kê 2 sẽ tạo mộtdanh sách tất cả các số nguyên là bội số của 3 hoặc 5 bằng cách sử dụng một phép bao hàm.Danh sách được tạo ra bằng cách bắt đầu với dãy số [1..999] nhưng chỉ sử dụng các giá trị chiahết cho 3 hoặc 5. Sau đó sử dụng một hàm reduce khác để tính tổng các giá trị đó. REPL tínhtoán một dòng mã này và in ra lời giải cho bài toán đó.Phần tiếp theo, chúng ta sẽ giải các bài toán phức tạp hơn một chút và tiếp tục khám pháCoffeeScript.Về đầu trangCác câu lệnh khối, các mảng và các tệpBài toán 4 của Dự án Euler (xem phần Tài nguyên) ...
Tìm kiếm theo từ khóa liên quan:
Tìm hiểu ngôn ngữ ví dụ thực hành Dự án Euler hệ quản trị cơ sở dữ liệu lập trình XML cơ sở dữ liệu nâng caoTài liệu liên quan:
-
Giáo án Tin học lớp 12 (Trọn bộ cả năm)
180 trang 272 0 0 -
Thực hiện truy vấn không gian với WebGIS
8 trang 254 0 0 -
Đề cương chi tiết học phần Quản trị cơ sở dữ liệu (Database Management Systems - DBMS)
14 trang 248 0 0 -
69 trang 145 0 0
-
Tiểu luận môn Cơ sở dữ liệu nâng cao: Mã hóa cơ sở dữ liệu Database Encryption
16 trang 124 0 0 -
57 trang 90 0 0
-
34 trang 85 0 0
-
Bài giảng Khái niệm về hệ cơ sở dữ liệu: Bài 2 - Hệ quản trị cơ sở dữ liệu
13 trang 79 0 0 -
Giáo trình Hệ quản trị cơ sở dữ liệu - Trần Thiên Thành
130 trang 75 0 0 -
Phát triển Java 2.0: Phân tích dữ liệu lớn bằng MapReduce của Hadoop
12 trang 73 0 0