2009-09-29 11 views

Odpowiedz

0

Napisz procedurę, która zwraca ostatni element z listy, a następnie poznaj trochę na temat wbudowanej procedury MAP (a.k.a. MAPCAR) i zobacz, czy zgaśnie jakaś żarówka.

+1

W typowym seldzie wbudowane funkcje OSTATNIE i MAPCAN mogą być również przydatne. –

9

Zakładając, że chodzi o Common Lisp, istnieje funkcja last, która zwraca listę zawierającą ostatni element listy. Jeśli użyjesz tej funkcji z mapcan, która stosuje daną funkcję do każdego elementu listy i zwraca połączone wyniki, dostaniesz to, czego chcesz.

Pamiętaj jednak, że dostęp do ostatniego elementu listy to operacja O(N), więc jeśli to nie jest tylko praca domowa, możesz rozważyć, czy nie możesz rozwiązać prawdziwego problemu wydajniej niż przy ostatnim pozycja każdej listy (może zamiast tego użyć innej bazy danych).

+0

Dziękuję za tę odpowiedź, ale możesz podać mi więcej informacji na ten temat. tak jak używa MAPCAR. Przepraszam, że pytam, ale to tylko moja podstawa w rozwijaniu się w seplenieniu nadziei, że możesz mi pomóc więcej na ten temat. Dzięki za ..... przepraszam, używam wspólnego seplenienia i przepraszam, że zamieszczam moją odpowiedź jako odpowiedź. –

+0

Dodałem linki do dokumentacji dla wymienionych funkcji. Zawierają przykłady. – sepp2k

+0

Cześć! I był w stanie wykonać jedną pracę jakiś sposób jak ja want.this jest mój kod (lastelements defun (L) \t (jeśli L \t \t (append (ostatni (pierwszy L)) (lastelements (reszta L))) \t)) Ale mam mały problem..Gdy wprowadzam '((4) (hello (świat))), ouput jest podobny do tego ((4) ((świat)), ale z przykładu wynik w naszym ćwiczeniu powinien wyglądać tak (4 (świat)). Z góry dziękuję! –

3

To, podobnie jak większość wczesnych problemów z pracą domową LISPy, jest ćwiczeniem w rekurencyjnym myśleniu i/lub myśleniem w kategoriach indukcji. Na początek możesz zadać sobie proste pytania, na które łatwo odpowiesz.

Na przykład, jeśli został poproszony o napisanie czegoś, co dał ci pierwszy element w każdej liście, bym coś o tym w ten sposób:

Biorąc pod uwagę listę list:

  1. Co jest pierwszym elementem każdej listy na liście '()? (easy - null)
  2. Co jest pierwszym elementem każdej listy na liście '(a)? (easy - a, lub może błąd)
  3. Co jest pierwszym elementem każdej listy na liście '((a))? (easy - (a))
  4. Co to jest pierwszy element dowolnej listy w formularzu '(anything), gdzie wszystko jest listą? (easy - (first anything))
  5. Jaki jest pierwszy element każdej listy w postaci '(anything morestuff)? (easy - (cons (first anything) (first-element morestuff)))
  6. Co to jest pierwszy atom? albo atom, albo błąd (zależy od twojego punktu widzenia)
  7. Co to jest pierwszy z wartości null? nil.
  8. Co to jest pierwsza lista? (car list)

Stąd możemy zacząć pisać kod:

;; 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 

Teraz to nie swoją pracę domową (celowo). Powinieneś grać z tym i zrozumieć, jak to działa. Twoim następnym celem powinno być, aby dowiedzieć się, jak to się różni od twojego zadania i jak się tam dostać.

Co się tyczy MAPCAR? Nie przejmuj się tym. Najpierw musisz nauczyć się rozwiązywać problemy rekurencyjne. Wtedy możesz martwić się o MAPCAR. Jaki jest cel tego zadania? Aby pomóc Ci nauczyć się myśleć w tym trybie.Dang w pobliżu wszystko w LISP/Scheme rozwiązuje się, myśląc w ten sposób.

Powód, dla którego poszedłem z wszystkimi pytaniami, aby rozbić go na części, o które się martwię. Jeśli dostanę zadanie "jak zrobić foo na każdym elemencie na liście?" Powinienem odpowiedzieć na pytania: Jak mam obsłużyć zero? Jak obchodzić się z atomem? Jak mam obchodzić się z pierwszym elementem na liście? Jak radzić sobie ze wszystkim innym? Kiedy już na nie odpowiedziałem, zastanawiam się, jak właściwie zrobić foo. Jak zrobić foo na zero? Jak zrobić foo na atomie? Jak zrobić foo na liście?

0

prawdopodobnie jest już rozwiązany, ale zorientowaliśmy się

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

Teraz działa to dla legit liście ... więc jeśli wywołanie funkcji Sfil z właściwej listy .... jeśli nie, to będzie powrót NIL

miejmy nadzieję będzie to pomocne dla każdego, kto uzna

+0

Kilka uwag: Po pierwsze, z reguły [nie umieszczaj zamykających parens w oddzielnych liniach] (http://dept-info.labri.u-bordeaux.fr/~idurand/enseignement/PFS/Common/Strandh- Tutorial/indentation.html); poziom wcięcia na formularzach wystarczy, aby zobaczyć strukturę kodu, a twój edytor powinien w każdym przypadku równoważyć parens. Po drugie, kod jest zwykle pisany małymi literami; tłumacz krzyczy na ciebie, ale nie musisz robić tego samego. Wreszcie, myślę, że twój podpis typu powinien być 'SELECT-FROM-INNER-LIST :: [[a]] -> [a]'; wartość zwracana nie jest * koniecznie * będzie listą list. – 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)) 

jako początkujący LISP, wysłać moje rozwiązanie.

+1

Chciałbym poszerzyć odpowiedź jeszcze bardziej. – ObieMD5

+0

Chciałbym zobaczyć twoją poprawę lub inne. :) –

+0

Zrobiłbym to bez efektów ubocznych, a właściwie zwrócił wynik, a nie tylko go wydrukował. Coś takiego jak '(defun lasts (list-of-list) (pętla dla l w list-of-list appending (last l)))' – Inaimathi

Powiązane problemy