2010-03-30 24 views
10

Được rồi, điều này có vẻ giống như một câu hỏi vô lý, nhưng làm thế nào để bạn trả về một danh sách trong lược đồ.?Đề án cách tạo danh sách

+0

Bạn có thể thấy điều này hữu ích: http://www.r6rs.org/. Nó không phải là quá kỹ thuật cho hầu hết các phần và có thể trả lời nhiều câu hỏi như thế này. Đây là một hướng dẫn rất hữu ích trong việc hiểu cách các chương trình Đề án được tạo ra từ các cấu trúc dữ liệu phổ biến nhất trong Đề án. – avpx

Trả lời

9

Có thể bạn chỉ muốn: '(2 3 5 7 11) hoặc (list 2 3 5 7 11)?

Bạn cũng có thể xây dựng danh sách bằng cách xác định một phần tử và một danh sách để thêm nó vào: (cons 2 (cons 3 '()))

Dưới đây là một ví dụ về việc trả lại một danh sách từ một hàm:

(define returnlist 
    (lambda(a b c) 
    (cons a (cons b (cons c '()))) 
)) 

(returnlist 2 3 4) 

giá trị Return sẽ danh sách : (list 2 3 4)

4

Một cách không quá nổi tiếng để làm điều này:

> ((lambda x x) 2 3 5 7 11) 
(2 3 5 7 11) 

có nghĩa là, "danh sách" chức năng chính nó có thể được định nghĩa là:

> (define list (lambda x x)) 
19

Dựa trên nhìn thấy một số câu hỏi khác của bạn, tôi nghĩ bạn có thể gặp khó khăn trong việc đầu quấn quanh các khái niệm trung tâm của một chức năng ngôn ngữ như Scheme.

Ở cấp độ bạn đang học Scheme (novice), mọi hàm bạn viết đều có đầu vào và đầu ra, và phần thân của mỗi hàm là một biểu thức duy nhất. Bất kỳ giá trị nào biểu thức đánh giá được trả về bởi hàm. Không cần phải "trả lại" bất cứ điều gì một cách rõ ràng như bạn sẽ làm trong một ngôn ngữ bắt buộc như Java hoặc C; nó chỉ xảy ra như một hậu quả trực tiếp của việc đánh giá biểu thức.

Nội dung của hàm là một biểu thức duy nhất. Nó không giống như Java, nơi mà phần thân của phương thức bao gồm một loạt các hướng dẫn:

do this 
then do that 
then do something else 
then return something (maybe) 

Các hàm lược đồ đánh giá một biểu thức; chỉ có bấy nhiêu thôi. Dưới đây là một chức năng đơn giản mà bổ sung thêm 5 thành bất kỳ số được thông qua như là một cuộc tranh cãi:

(define (add5 x) 
    (+ x 5)) 

Các cơ quan chức năng là (+ x 5), mà chỉ là một biểu hiện được đánh giá. Giá trị của x được cắm vào, chức năng + (bổ sung) được áp dụng cho x và 5, và kết quả được trả về.

Danh sách không khác nhiều. Tất cả những gì bạn cần là một biểu thức sẽ xây dựng một danh sách. Hai đã được đề cập: danh sách được sử dụng để xây dựng danh sách từ đầu nếu bạn đã có tất cả các yếu tố; cons được sử dụng để thêm một phần tử vào danh sách hiện có và thường được sử dụng đệ quy.

Dưới đây là một chức năng mà tiêu thụ một số n và xây dựng danh sách (n n-1 n-2 ... 0)

(define (makelist n) 
    (if (= n 0) 
    (list 0)      ; base case. Just return (0) 
    (cons n (makelist (- n 1))))) ; recursive case. Add n to the head of (n-1 n-2 ... 0) 

Trong cả hai cơ sở và các trường hợp đệ quy, một danh sách được trả lại bằng cách đơn giản đánh giá một biểu thức có sử dụng một trong những chức năng danh sách xây dựng .

Đây là một ví dụ khác.Cái này sử dụng chức năng add5 của chúng tôi để thêm từ 5 đến từng yếu tố của một danh sách các số (lon):

(define (add5list lon) 
    (if (null? lon) 
    `()     ; base case: lon is empty. Return an empty list. 
    (cons (add5 (car lon)) (add5list (cdr lon))))) ; recursive case. 
                ; Add 5 to the head of lon and prepend it to the tail of lon 

Một lần nữa, cả hai cơ sở và các trường hợp đệ quy đang quay trở lại danh sách bằng cách đánh giá biểu thức mà kết quả trong danh sách.

Điều quan trọng cần nhớ về Đề án là tất cả các hàm trả về một cái gì đó, và điều gì đó đơn giản là kết quả của việc đánh giá một biểu thức. Phần thân của hàm Scheme là một biểu thức duy nhất.

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