2010-06-11 23 views
5

Tôi đã bắt đầu học chương trình, phần lớn là vui, và vì trước đây tôi chưa bao giờ sử dụng một ngôn ngữ chức năng. Tôi đã chọn Đề án vì tôi muốn đọc SICP trong một thời gian dài.Tại sao việc sử dụng khuyết điểm để tạo một cặp hai danh sách tạo ra một danh sách và hai phần tử?

Dù sao, tôi hiện đang tìm hiểu về danh sách và trước đó tôi đã học về khuyết tật, ô tô và cdr. Và có một ví dụ tạo danh sách các danh sách có khuyết điểm, như sau:

(cons (list 1 2) (list 3 4)) 

Danh sách kết quả là ((1 2) 3 4), điều này không có ý nghĩa với tôi, tôi mong đợi ((1 2) (3 4)) là kết quả (danh sách được tạo thành từ hai danh sách). Tại sao nó cư xử như thế? Tôi nhận ra rằng nếu tôi đã sử dụng xe hơi, tôi sẽ nhận được (1 2), và cdr tôi nhận được (3 4) becaue cdr luôn luôn trả về "phần còn lại", nhưng tôi không hiểu tại sao danh sách không được thực hiện của hai danh sách?

+1

Câu hỏi này hơi khác một chút, nhưng câu trả lời chính xác trả lời câu hỏi của bạn: http://stackoverflow.com/questions/2921912/in-sicp-exercise-2-26-using-drscheme-why-does-cons-return -a-list-instead-of-ap –

+1

tại sao bạn sẽ tạo danh sách với CONS khi bạn tạo danh sách bằng LIST trước đây? Tại sao không gắn bó với việc sử dụng DANH SÁCH để tạo danh sách? CONS không làm giống như LIST - đó cũng là lý do tại sao chúng là các hàm khác nhau. –

+0

Đó là một bài tập trong SICP – fingerprint211b

Trả lời

9

Bạn nhận danh sách với (1 2) làm phần tử đầu tiên (ô tô) và (3 4) làm phần còn lại (cdr) vì đối số đầu tiên chống lại là phần tử đầu tiên của danh sách và đối số thứ hai là danh sách chứa phần còn lại mặt hàng.

Điều này gần giống với cấu trúc của danh sách: mỗi nút của danh sách (đúng) chứa phần tử và danh sách chứa tất cả phần tử khác. cons tạo một nút như vậy.

Nếu đối số thứ hai là cons sẽ trở thành phần tử thứ hai của danh sách, bạn sẽ tạo danh sách với ba đối số như thế nào? Bạn sẽ phải thực hiện cons variardic tại thời điểm đó, nó sẽ chỉ là một tên khác cho list.

Nếu bạn muốn tạo danh sách các danh sách, hãy sử dụng (list (list 1 2) (list 3 4)).

+0

Cảm ơn, điều đó đã giúp ích. – fingerprint211b

+0

'(1 2)' là ô tô, không phải cdr, và '(3 4)' là cdr. – Zorf

+0

@ Lajla: Bah, tất nhiên rồi. Đã sửa. – sepp2k

1
list A: [ |  ] 
      1 [ | ] 
       2/

list B: [ |  ] 
      3 [ | ] 
       4/

====================== 

(cons A B) 

[   |   ] 
[ |  ] [ |  ] 
    1 [ | ]  3 [ | ] 
     2/  4/

Một đại diện đồ họa của cấu trúc bên trong có thể giúp chúng tôi hình dung vấn đề.

Và điều này sẽ giúp một số chi tiết:

[   |   ] 
    X  [ |  ] 
       3 [ | ] 
        4/

Bạn có thấy mô hình? Ở trên là danh sách (X 3 4). Đó là lý do (cons A B) chỉ vẽ phần car dưới dạng danh sách riêng biệt chứ không phải là cdr.

3
(list (list 1 2) 
     (list 3 4)) 

cũng giống như

(cons (list 1 2) 
     (cons (list 3 4) 
      '())) 

mà kết quả trong

((1 2) (3 4)) 

mà cũng có thể được viết như

((1 . (2 .())) 
. 
((3 . (4 .())) 
    . 
())) 
0

Bởi vì một khuyết điểm của tế bào là không một danh sách của hai yếu tố, cả hai thường bị nhầm lẫn. Nếu (a . b) là ô điều hướng thì (a . (b .())) là danh sách gồm hai phần tử. Bất kỳ danh sách nào an toàn cho danh sách trống cụ thể là một ô khuyết tật có trường ô tô chứa phần tử đầu tiên và trường cdr của nó chứa danh sách chứa các phần tử còn lại. Do đó, một danh sách chỉ đơn giản là một cây nhị phân có lá bên phải nhất là hằng số đặc biệt () hoặc nil tùy thuộc vào phương ngữ của bạn.

Đó là lý do tại sao (cons 0 '(1 2 3)) đánh giá để (0 1 2 3) và không (0 (1 2 3)) chúng ta tạo ra một tế bào khuyết điểm mà xe là 0, và có cdr là (1 2 3), do đó, một danh sách (0 1 2 3).

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