2009-09-29 37 views
5

Chúng ta hãy nói rằng tôi có một danh sách ((3 4 5) (d e f) (h i j) (5 5 5 5))Get cuối phần tử của mỗi danh sách

Làm thế nào tôi có thể nhận được các yếu tố cuối cùng của mỗi danh sách theo cách như vậy mà đầu ra sẽ trông như thế này (5 f j 5)?

+4

trông giống như bài tập về nhà .. – nothrow

Trả lời

0

Viết thủ tục trả về phần tử cuối cùng của danh sách, sau đó tìm hiểu một chút về quy trình được xây dựng trong MAP (a.k.a. MAPCAR) và xem liệu bóng đèn có tắt hay không.

+1

Trong phổ biến-lisp, các chức năng được xây dựng trong LAST và MAPCAN cũng có thể khá hữu ích. –

9

Giả sử đây là về Common Lisp, có một hàm last trả về một danh sách chứa mục cuối cùng của danh sách. Nếu bạn sử dụng hàm này với mapcan, áp dụng một hàm nhất định cho mỗi phần tử của danh sách và trả về kết quả được ghép nối, bạn sẽ nhận được những gì bạn muốn. Lưu ý rằng mặc dù truy cập phần tử cuối cùng của danh sách là hoạt động O(N), vì vậy nếu đây không chỉ là bài tập về nhà, bạn có thể cân nhắc xem bạn có thể giải quyết vấn đề thực tế hiệu quả hơn so với lần cuối cùng không mục của mỗi danh sách (có thể sử dụng một cơ sở hạ tầng khác thay thế).

+0

Cảm ơn câu trả lời đó nhưng bạn có thể cho tôi biết thêm thông tin về điều đó không. như cách MAPCAR được sử dụng. Xin lỗi để yêu cầu nhưng điều này chỉ là của tôi firt attemp trong phát triển trong lisp hy vọng các bạn có thể giúp tôi nhiều hơn về điều này .. Cảm ơn trước..btw, im bằng cách sử dụng phổ biến lisp và xin lỗi mà tôi đăng trả lời của tôi như là câu trả lời. –

+0

Tôi đã thêm các liên kết vào tài liệu cho các chức năng được đề cập. Chúng chứa các ví dụ. – sepp2k

+0

Xin chào! tôi đã có thể làm một công việc một số cách cách tôi want.this là mã của tôi (lastelements defun (L) \t (nếu L \t \t (append (cuối cùng (lần đầu tiên L)) (lastelements (phần còn lại L))) \t) ) Nhưng tôi có vấn đề nhỏ .. Khi tôi nhập '((4) (hello (world))) ouput là một cái gì đó như thế này ((4) ((thế giới))) nhưng từ ví dụ đầu ra cho trong tập thể dục của chúng tôi nó sẽ trông như thế này (4 (thế giới)) .. Cảm ơn trước! –

3

Điều này, giống như hầu hết các vấn đề về bài tập về nhà của LISPy ban đầu là một bài tập suy nghĩ đệ quy và/hoặc suy nghĩ về cảm ứng. Cách bắt đầu là tự hỏi những câu hỏi đơn giản mà bạn có thể trả lời dễ dàng.

Ví dụ, nếu bạn đã được yêu cầu viết một cái gì đó đã cho bạn những yếu tố đầu tiên trong mỗi danh sách, tôi sẽ điều về nó theo cách này:

Cho một danh sách liệt kê:

  1. gì là yếu tố đầu tiên của mỗi danh sách trong danh sách '()? (dễ dàng - null)
  2. Yếu tố đầu tiên của mỗi danh sách trong danh sách '(a) là gì? (dễ dàng - a hoặc có thể là lỗi)
  3. Yếu tố đầu tiên của mỗi danh sách trong danh sách '((a)) là gì? (dễ dàng - (a))
  4. Yếu tố đầu tiên của bất kỳ danh sách nào trong biểu mẫu '(anything), trong đó bất cứ điều gì là danh sách? (dễ dàng - (first anything))
  5. Yếu tố đầu tiên của mỗi danh sách trong biểu mẫu '(anything morestuff) là gì? (dễ dàng - (cons (first anything) (first-element morestuff)))
  6. Nguyên tử đầu tiên là gì? hoặc nguyên tử hoặc lỗi (phụ thuộc vào quan điểm của bạn)
  7. Đầu tiên của null là gì? nil.
  8. Danh sách đầu tiên là gì? (car list)

Từ đây chúng ta có thể bắt đầu viết mã:

;; here's first, meeting questions 6-8 
(define first (lambda (l) 
    (cond 
    ((null? l) nil) ; Q7 
    ((atom? l) l) ; Q6 
    (t (car l))))) ; Q8 

;; with first we can write first-element, meeting questions 1-5 
(define first-element (lambda (l) 
    (cond 
    ((null? l) nil) ; Q1 
    ((atom? l) (first l)) ; Q2 
    (t (cons (first (car l) (first-element (cdr l)))))))) ; Q4-5 

Bây giờ đây không phải là bài tập ở nhà của bạn (cố ý). Bạn nên chơi với điều này và hiểu cách nó hoạt động. Mục tiêu tiếp theo của bạn là tìm hiểu cách điều này khác với nhiệm vụ của bạn và cách đạt được mục tiêu đó.

Đối với MAPCAR? Đừng lo lắng về điều đó. Bạn cần tìm hiểu cách giải quyết các vấn đề đệ quy trước tiên. Sau đó, bạn có thể lo lắng về MAPCAR. Điểm của bài tập này là gì? Để giúp bạn học cách suy nghĩ trong chế độ này.Dang gần mọi thứ trong LISP/Đề án được giải quyết bằng cách suy nghĩ theo cách này.

Lý do tôi đi kèm với tất cả các câu hỏi để chia nhỏ các phần mà tôi lo lắng. Nếu tôi được giao nhiệm vụ "làm cách nào để thực hiện foo trên mọi mục trong danh sách?" Tôi nên trả lời các câu hỏi: Làm thế nào để xử lý null? Làm thế nào để xử lý một nguyên tử? Làm cách nào để xử lý trên phần tử đầu tiên trong danh sách? Làm cách nào để xử lý mọi thứ khác? Một khi tôi đã trả lời, sau đó tôi tìm ra cách để thực sự làm foo. Làm thế nào để làm foo trên null? Làm thế nào để làm foo trên một nguyên tử? Làm thế nào để làm foo trên một danh sách?

0

lẽ nó đã được giải quyết, nhưng tôi figured này ra

; SELECT-FROM-INNER-LIST :: [list] -> [list] 
(DEFUN SFIL (lst) 
    (COND ((NULL lst) NIL) 
     ((LISTP (FIRST lst)) (APPEND (LAST (FIRST lst)) (SFIL (REST lst)))) 
)) 

Bây giờ, công trình này cho danh sách legit ... vì vậy nếu bạn gọi hàm SFIL với danh sách đúng .... nếu không, nó sẽ trở NIL

hy vọng điều này sẽ rất hữu ích, cho bất cứ ai tìm thấy nó

+0

Một vài ý kiến: Thứ nhất, như một quy luật, [không đặt dấu ngoặc đóng trên các dòng riêng biệt] (http://dept-info.labri.u-bordeaux.fr/~idurand/enseignement/PFS/Common/Strandh- Hướng dẫn/indentation.html); mức thụt đầu dòng trên các biểu mẫu là đủ để xem cấu trúc của mã và trình soạn thảo của bạn nên cân bằng parens cho bạn trong mọi trường hợp. Thứ hai, mã thường được viết bằng chữ thường; thông dịch viên hét lại với bạn, nhưng bạn không cần phải làm như vậy. Cuối cùng, tôi nghĩ chữ ký của bạn nên là 'SELECT-FROM-INNER-LIST :: [[a]] -> [a]'; giá trị trả về không phải là * nhất thiết * sẽ là danh sách các danh sách. – Inaimathi

0
(defun get-last-lists (s) 
    (setq rt 'nil) 
    (loop for i from 0 to (- (length s) 1) 
     do (setq rt (append rt (last (nth i s))))) 
    (print rt)) 

như một người mới bắt đầu của lisp, tôi gửi giải pháp của tôi.

+1

Tôi sẽ mở rộng câu trả lời của bạn một số chi tiết. – ObieMD5

+0

Tôi muốn thấy sự cải thiện của bạn, hoặc những người khác. :) –

+0

Tôi sẽ làm điều đó mà không có tác dụng phụ, và thực sự trả lại kết quả thay vì chỉ in nó. Một cái gì đó như '(defun kéo dài (danh sách-of-danh sách) (vòng lặp cho l trong danh sách-of-list appending (last l)))' – Inaimathi

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