2015-02-15 33 views
5

Theo F # 's listdocumentation:Tại sao phải triển khai danh sách không thể thay đổi dưới dạng danh sách được liên kết?

  • "Một danh sách trong F # là một lệnh, bất biến loạt các yếu tố cùng loại"

  • "Lists trong F # được thực hiện như các danh sách được liên kết đơn lẻ "

Tại sao không thực hiện nó liên tục trong bộ nhớ vì nó không thay đổi và do đó có kích thước cố định? Tại sao lại sử dụng F # list thay vì F # array?

+1

Liên quan: [Tại sao danh sách khuyết điểm được liên kết với lập trình chức năng?] (Http://programmers.stackexchange.com/questions/132309/why-are-cons-lists-associated-with-functional-programming) – ryanpattison

+1

Một điều để xem xét là danh sách không thực sự là kích thước cố định - bạn viết rất nhiều mã giống như 'nếu có gì đó sau đó: :(recurse ...) else []' ở đây, xây dựng danh sách có danh sách được liên kết là tự nhiên –

+1

@JohnPalmer có, chúng * là * kích thước cố định. Khi bạn thêm một phần tử, nó sẽ tạo một danh sách * mới *. Danh sách gốc vẫn tồn tại và không thay đổi theo bất kỳ cách nào. – latkin

Trả lời

3

Họ phục vụ các mục đích khác nhau, ví dụ:

Bạn sử dụng một mảng trong F # để lưu trữ một lượng lớn dữ liệu cần phải được truy cập một cách ngẫu nhiên với chi phí tương đối thấp.

Danh sách trong F # rất hữu ích khi bạn cần tích luỹ thứ gì đó qua các lần lặp lại của hàm đệ quy. Mảng không chơi tốt ở đây, vì chúng có kích thước cố định.

Với list, bạn có thể thêm tất cả các phần tử của ListM (cỡ M) vào ListN (cỡ N) trong thời gian O (M). Tương tự, bạn có thể thêm một phần tử đơn vào danh sách bất kỳ trong thời gian O (1).

+1

Cảm ơn câu trả lời. Nhưng tôi chưa tin điều đó: P. Trong trường hợp phương thức đệ quy được ghép nối 'ListA' và' ListB', nó sẽ trỏ đuôi của 'ListA' vào phần đầu của' ListB'. Nhưng ý tưởng rằng bạn có thể thay đổi nơi mà nút đuôi của 'ListA' là trỏ sẽ mâu thuẫn với' ListA' là không thay đổi. Đó là lý do của tôi; xin vui lòng sửa nơi tôi sai. – user2588666

+0

Vấn đề là các phương pháp đệ quy thông thường không nối, chúng nối thêm cái không giống nhau. Chúng nối thêm một phần tử vào bộ sưu tập trên mỗi lần lặp. Việc thêm vào danh sách được liên kết sẽ rẻ hơn nhiều so với việc thực hiện nó với một mảng. – Gustavo

+0

Khi bạn nói "nối thêm", bạn có nghĩa là nó tạo ra một danh sách hoàn toàn mới có chứa ListA và ListB không? – user2588666

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