Procedures (Các thủ tục), như đã nói ở các bài trước, cũng giống như các function toán học nguyên bản gốc sơ khai mà chúng ta đã học ở trường. Các procedure tạo ra các outputs từ một hoặc nhiều parameter được truyền vào procedure. Nhưng có một điều khác biệt quan trọng giữa các biểu thức toán học với các procedure của chương trình máy tính. Các procedure có tính hiệu quả cao hơn.
Như là một trường hợp cụ thể, xem xét một ví dụ tính căn bậc 2 của một số bất kỳ. Chúng ta có thể định nghĩa một function tính căn bậc hai như sau:
√x = y nếu y ≥ 0 và y^2 = x.
Đây là một sự diễn tả toán học thông thường ở trường mà chúng ta đã học. Chúng ta sử dụng nó để ước lượng xem một số có phải là căn bậc hai của một số khác hay không. Ở khía cạnh khác, định nghĩa trên không diễn tả một procedure trong máy tính. Không có sự hướng dẫn nào về cách thật sự để tìm căn bậc hai của một số cho trước trong một procedure của chương trình máy tính cả. Vì thế định nghĩa trên không giúp chúng ta tái định nghĩa lại một procedure về cách tìm một căn bậc hai của một số cho trước.
Điều này nảy sinh ra một câu hỏi cần được trả lời:
Sự tương phản giữa các function và procedure là sự phản ánh khác biệt chung giữa việc mô tả các thuộc tính của sự vật và việc mô tả cách thức thực hiện của sự việc đó, hoặc, như đôi khi người ta nhắc đến, sự khác biệt giữa kiến thức khai báo và kiến thức mệnh lệnh. Trong toán học, chúng ta thường quan tâm đến các mô tả khai báo (cái gì), trong khi đó trong khoa học máy tính chúng ta thường quan tâm đến mô tả dòng lệnh(làm thế nào để).
Làm thế nào để tính căn bậc hai của một số ? Cách phổ biến là sử dụng mệnh đề Newton’s của sự xấp xỉ liên tục, mệnh đề nói rằng: nếu chúng ta dự đoán trước kết quả y của căn bậc hai của một số bất kì x, thì chúng ta có thể tính toán được giá trị dự doán tốt hơn (gần đến kết quả của căn bật hai nhất) bằng việc lấy giá trị trung bình của y và x/y.
Lấy ví dụ: Chúng ta có thể tính toán được căn bậc hai của 2 bằng việc follow theo mệnh đề Newtons như sau. Lấy kết quả dự đoán ban đầu của chúng ta là 1:
Tiếp tục quá trình này cho đến khi chúng ta đạt được kết quả xấp xỉ tốt hơn của căn bậc hai một số.
Bây giờ chúng ta sẽ thực hiện tiến trình trên trong một định nghĩa các procedures như sau. Chúng ta bắt đầu với số cần được tính căn bậc hai và một giá trị dự đoán của căn bậc hai của nó. Nếu giá trị dự đoán bỏ qua sai số thỏa mãn điều kiện của chúng ta, thì nó là kết quả; nếu không, chúng ta phải lặp lại tiến trình để cải thiện giá trị của dự đoán. Chúng ta viết quá trình này như là một thủ tục như sau:
Gía trị của guess được cải thiện bởi việc lấy giá trị trung bình của guess với kết quả phép chia quotient.
We also have to say what we mean by “good enough.” e following
will do for illustration, but it is not really a very good test.
Chúng ta cũng cần phải biết rằng ý nghĩa của một “đủ tốt- good enough” ( bỏ qua sai số nhỏ đáng kể – 0.001). Theo như quá trình bên dưới, nhưng nó không thật sự tốt để test.
(define (good-enough? guess x) (< (abs (- (square guess) x)) 0.001))
Finally, we need a way to get started. For instance, we can always guess
that the square root of any number is 1
Và sau cùng, chúng ta cần một cách để chạy chương trình đầu tiên. Ví dụ, chúng ta luôn lấy giá trị guess là 1 để tính căn bậc hai của một số bất kì như sau:
(define (sqrt x) (sqrt-iter 1.0 x))
Bây giờ, chúng ta có thể sử dụng procedure sqrt như sau:
(sqrt 9) ==> Result: 3.00009155413138
(sqrt (+ 100 37)) ==> 11.704699917758145
(sqrt (+ (sqrt 2) (sqrt 3))) ==> 1.7739279023207892
(square (sqrt 1000)) ==> 1000.000369924366
Nếu các bạn có thắc mắc nào thì hay để lại bình luận bên dưới nhé
Bài viết tiếp theo: Procedures as Black-Box Abstractions
One thought on “Ví dụ: Căn bậc hai của một số bất kỳ sử dụng mệnh đề Newtons.”