Tôi phản đối với một cái gì đó tôi liên tục thấy lặp đi lặp lại trong hầu hết các câu trả lời này, rằng điều làm cho hàm trở thành hàm là nó trả về một giá trị.
Hàm không chỉ là bất kỳ phương thức cũ nào trả về giá trị. Không phải như vậy: Để một phương thức là một hàm thực, nó phải trả về cùng một giá trị luôn được cung cấp một đầu vào cụ thể. Một ví dụ về phương thức không phải là hàm làrandom
phương thức trong hầu hết các ngôn ngữ, bởi vì mặc dù nó trả về một giá trị nhưng giá trị không phải lúc nào cũng giống nhau.
Do đó, một chức năng gần giống với bản đồ (ví dụ: x -> x'
đối với chức năng một chiều). Đây là một sự khác biệt rất quan trọng giữa các phương thức và hàm thông thường bởi vì khi xử lý các hàm thực, thời gian và thứ tự chúng được đánh giá sẽ không bao giờ quan trọng vì điều này không phải lúc nào cũng đúng với các hàm không.
Đây là một ví dụ khác về một phương thức không phải là một hàm nhưng nếu không vẫn sẽ trả về một giá trị.
// The following is pseudo code:
g(x) = {
if (morning()) {
g = 2 * x;
}
else {
g = x;
}
return g;
}
Tôi tiếp tục phản đối quan niệm rằng các thủ tục không trả về giá trị. Một thủ tục chỉ là một cách cụ thể để nói về một chức năng hoặc phương thức. Vì vậy, điều đó có nghĩa là nếu phương thức cơ bản mà thủ tục của bạn xác định hoặc thực hiện trả về một giá trị thì hãy đoán xem thủ tục đó trả về giá trị gì. Lấy ví dụ đoạn trích sau từ SICP :
// We can immediately translate this definition into a recursive procedure
// for computing Fibonacci numbers:
(define (fib n)
(cond ((= n 0) 0)
((= n 1) 1)
(else (+ (fib (- n 1))
(fib (- n 2))))))
Bạn đã nghe nói về các thủ tục đệ quy gần đây? Họ đang nói về một hàm đệ quy (một hàm thực) và nó trả về một giá trị và họ đang sử dụng từ "thủ tục". Vì vậy, sự khác biệt là gì?
Một cách nghĩ khác về một chức năng (bên cạnh ý nghĩa được đề cập ở trên) là một đại diện trừu tượng của một lý tưởng như chữ số 1. Một thủ tục là thực hiện thực tế điều đó. Cá nhân tôi nghĩ rằng chúng có thể thay thế cho nhau.
(Lưu ý, nếu bạn đọc chương đó từ liên kết tôi cung cấp, bạn có thể thấy rằng một khái niệm khó nắm bắt hơn không phải là sự khác biệt giữa hàm và thủ tục, mà là quy trình và thủ tục. Bạn có biết rằng thủ tục đệ quy có thể có một quy trình đệ quy quá trình lặp lại?)
Một tương tự cho các thủ tục là công thức nấu ăn. Ví dụ; giả sử bạn có một máy gọi là make-pies
máy này có thành phần (fruit, milk, flower, eggs, sugar, heat)
và máy này trả về a pie
.
Một đại diện của máy này có thể trông giống như
make-pies (fruit, milk, flower, eggs, sugar, heat) = {
return (heat (add fruit (mix eggs flower milk)))
}
Tất nhiên đó không phải là cách duy nhất để làm một chiếc bánh.
Trong trường hợp này chúng ta có thể thấy rằng:
A function is to a machine
as a procedure is to a recipe
as attributes are to ingredients
as output is to product
Sự tương tự đó là ổn nhưng nó bị hỏng khi bạn tính đến việc khi bạn làm việc với một chương trình máy tính, mọi thứ đều là một sự trừu tượng. Vì vậy, không giống như trong trường hợp của một công thức cho một máy, chúng tôi đang so sánh hai thứ mà bản thân nó trừu tượng; Hai điều có thể giống nhau. Và tôi cho rằng chúng (cho tất cả các mục đích và mục đích) giống nhau.