2009-03-19 16 views
5

Tôi có một hàm có danh sách có hai hoặc ba phần tử.Làm cách nào để biết danh sách có mục thứ ba?

;; expecting either ((a b c) d) or ((a b c) d e) 
(define (has-third-item ls) 
     (if (null? (caddr ls)) 
      false 
      true) 
    ) 

Nhưng mã này không thành công với

mcar: expects argument of type <mutable-pair>; given() 

trên (null? (Ls caddr)) biểu.

Tôi cũng đã cố gắng

(eq? '() (caddr ls)) 

nhưng nó đã không làm việc một trong hai. Làm thế nào để tôi biết nếu có một mục thứ ba hay không?

+0

Rất tò mò. Vui lòng nói ngôn ngữ nào? –

+0

Ngôn ngữ là Sơ đồ – Kai

Trả lời

9

Bạn không muốn caddr, bạn muốn (nếu (null? (Cddr ls)) ... Hoặc chỉ sử dụng độ dài để tìm độ dài của danh sách và so sánh nó với giá trị bạn quan tâm.

các '() mà chấm dứt một danh sách sẽ luôn ở vị trí cdr của một cặp, vì vậy tìm kiếm nó ở vị trí xe (mà cad + r sẽ làm) sẽ không được sản xuất.

4

Vấn đề là nếu bạn có danh sách có ít nhất hai mục, bạn không thể lấy caddr của nó. Hãy thử điều này:

(define (has-third-item lst) 
    (<= 3 (length lst))) 

Có thể có một số trường hợp việc lấy độ dài của danh sách có thể không hiệu quả (chẳng hạn như danh sách chứa hàng triệu mục); trong trường hợp này, chúng ta có thể kiểm tra để xem nếu danh sách có chiều dài bằng không, một, hoặc hai bằng tay:

(define (has-third-item lst) 
    (not (or (null? lst) 
      (null? (cdr lst)) 
      (null? (cddr lst))))) 

chỉnh sửa: Về twoother câu trả lời, trong khi lấy cddr có thể làm việc trong trường hợp này như miền đầu vào bao gồm danh sách có hai hoặc ba phần tử, mục thứ ba sẽ vẫn không thành công cho các danh sách có số không hoặc một. Vì lợi ích của tính tổng quát, tôi khuyên bạn nên sử dụng giải pháp hoạt động cho bất kỳ miền nào.

1

Miễn là bạn biết danh sách của bạn chỉ có hai hoặc ba yếu tố (như bạn nói nó có), bạn có thể làm

(define (has-third-item? l) 
    (not (null? (cddr l)))) 

Bạn đang kiểm tra liệu các khuyết điểm thứ hai tế bào (cddr l)cdr hay không. Bạn không cần phải kiểm tra xem bản thân l là null hay l chỉ có một phần tử, trừ khi bạn muốn có một hàm tổng quát hơn.

0

thử ...

(and l (cdr l)(cddr l)) 
0

Tại sao không sử dụng (ls thứ ba)

Sẽ trở lại các yếu tố thứ ba hoặc NIL nếu không có mặt.

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