2012-01-24 38 views
7

Tại sao trong lisp (Emacs Lisp và Scheme như tôi biết) xây dựng như (*) trả về 1?nhân danh sách trống trong emacs lisp

Những gì tôi nhân ở đây? Làm cách nào tôi có thể gọi hàm này * mà không có đối số?

Trả lời

10

Đây là một quy ước toán học: product of an empty sequence of numbers là một, theo định nghĩa; lưu ý rằng một là phần tử nhận dạng cho phép nhân (1 × a = a × 1 = a). Điều này thuận tiện vì bạn có thể gọi * với số lượng đối số thay đổi mà không phải lo lắng về trường hợp không có đối số nào.

Tương tự, tổng của một chuỗi rỗng số là 0, phần tử nhận dạng để bổ sung. Hãy thử phát hành (+) tại lời nhắc Lisp của bạn.

+4

'(* (* (*) (*) (*)) (+ (*) (*) (*) (*) (*) (*)) (+ (*) (* (+ (*) (*) (*) (*)) (+ (*) (*) (*)) (+ (*) (*) (*))))) ' –

+0

@EliBarzilay: là rằng sexpr của Beast? –

+0

larsmans, cảm ơn bạn đã trả lời rõ ràng. – karasiov

4

Đó là tài sản được kế thừa từ toán học. Nó giống như Ngoài ra, bạn có thể cộng lại với nhau bất kỳ số lượng nào, với trường hợp đặc biệt mà không thêm số nào cùng nhau cung cấp cho bạn tổng số không.

Tương tự như vậy đối với phép nhân, nếu bạn nhân một số tùy ý các số, bạn sẽ nhận được sản phẩm. Để có được điều này để làm việc cho không có số, 1 được sử dụng như là giá trị cơ bản (trong đó có một số tên lạ mắt trong toán học, mà tôi đã quên nhiều năm trước đây).

Vì vậy, bạn có sử dụng thực tế cho điều này bằng ngôn ngữ lập trình hay không. Có, vì bạn có thể gọi một hàm như +* với số lượng đối số tùy ý, tôi sẽ nói có. Ví dụ:

(apply '+ '(2 3 4)) => 9 
(apply '+ '(2 3)) => 5 
(apply '+ '(2))  => 2 
(apply '+ '())  => 0 

(apply '* '(2 3 4)) => 24 
(apply '* '(2 3)) => 6 
(apply '* '(2))  => 2 
(apply '* '())  => 1 
+1

Lưu ý: trong Đề án, bạn phải xóa ''' (tức là 'trích dẫn') ở phía trước toán tử để chạy các ví dụ. Ví dụ, '(apply + '())' thay vì '(apply' + '())'. –

Các vấn đề liên quan