2009-09-29 16 views

Respuesta

0

Escriba un procedimiento que devuelva el último elemento de una lista, luego aprenda un poco sobre el procedimiento MAP incorporado (a.k.a. MAPCAR) y vea si se apagan las bombillas.

+1

En common-lisp, las funciones incorporadas LAST y MAPCAN también pueden ser bastante útiles. –

9

Suponiendo que se trata de Common Lisp, existe una función last que devuelve una lista que contiene el último elemento de una lista. Si usa esta función con mapcan, que aplica una función determinada a cada elemento de una lista y devuelve los resultados concatenados, obtendrá lo que desee.

Tenga en cuenta que acceder al último elemento de una lista es una operación O(N), así que si esto no es solo tarea después de todo, es posible que desee considerar si no puede resolver el problema real de manera más eficiente que tomar el último elemento de cada lista (tal vez use otra estructura de datos en su lugar).

+0

Gracias por esa respuesta, pero ¿pueden darme más información al respecto? cómo se usa MAPCAR. Perdón por preguntar, pero este es mi último intento de desarrollar en lisp espero que ustedes puedan ayudarme más en esto ... Gracias de antemano ... Por cierto, estoy usando el ceceo común y lamento que publique mi respuesta como respuesta. –

+0

He agregado enlaces a la documentación de las funciones mencionadas. Esos contienen ejemplos. – sepp2k

+0

¡Hola! yo era capaz de hacer un trabajo de alguna manera la forma en que want.this es mi código (lastelements defun (L) \t (si L \t \t (append (última (primera L)) (lastelements (resto L))) ) Pero tengo un pequeño problema ... Cuando ingreso '((4) (hello (mundo))) la salida es algo como esto ((4) ((mundo))) pero del ejemplo rendimiento dado en nuestro ejercicio debe verse así (4 (mundo)) .. Gracias de antemano! –

3

Esto, al igual que la mayoría de los primeros problemas de tareas de LISPy, es un ejercicio de pensar recursivamente y/o pensar en términos de inducción. La forma de comenzar es hacerse preguntas sencillas a las que pueda responder fácilmente.

Por ejemplo, si se le había pedido a escribir algo que le dio el primer elemento de cada lista, lo haría cosa de esta manera:

dado una lista de listas:

  1. Lo es el primer elemento de cada lista en la lista '()? (fácil - null)
  2. ¿Cuál es el primer elemento de cada lista en la lista '(a)? (fácil - a, o tal vez un error)
  3. ¿Cuál es el primer elemento de cada lista en la lista '((a))? (fácil - (a))
  4. ¿Cuál es el primer elemento de cualquier lista en el formulario '(anything), donde todo es una lista? (fácil - (first anything))
  5. ¿Cuál es el primer elemento de cada lista en el formulario '(anything morestuff)? (fácil - (cons (first anything) (first-element morestuff)))
  6. ¿Qué es lo primero de un átomo? ya sea el átomo o un error (depende de su punto de vista)
  7. ¿Qué es primero de nulo? nil.
  8. ¿Cuál es el primero de una lista? (car list)

Desde aquí podemos empezar a escribir código:

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

Ahora bien, este no es su tarea (intencionalmente). Deberías jugar con esto y entender cómo funciona. Su próximo objetivo debe ser averiguar cómo esto difiere de su tarea y cómo llegar allí.

Con respecto a MAPCAR? No te preocupes por eso Primero debe aprender a resolver problemas recursivos. Entonces puedes preocuparte por MAPCAR. ¿Cuál es el objetivo de esta tarea? Para ayudarte a aprender a pensar de esta manera.Dang cerca de todo en LISP/Scheme se resuelve pensando de esta manera.

La razón por la que hice todas las preguntas para desglosarla en las partes que me preocupan. Si me dan la tarea "¿cómo hago foo en cada elemento en una lista?" Debo responder a las preguntas: ¿Cómo puedo manejar el nulo? ¿Cómo se maneja un átomo? ¿Cómo manejo el primer elemento en la lista? ¿Cómo manejo todo lo demás? Una vez que he respondido eso, entonces descubro cómo hacerlo realmente. ¿Cómo hago foo en null? ¿Cómo hago foo en un átomo? ¿Cómo hago foo en una lista?

0

probablemente ya está resuelto, pero me di cuenta de esto

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

Ahora, esto funciona para la lista de fiar ... así que si se llama a la función con SFIL lista correcta .... si no, se respuesta negativa

espero que esto sea útil, para cualquier persona que lo encuentra

+0

Algunos comentarios: Primero, como regla general, [no ponga parens de cierre en líneas separadas] (http://dept-info.labri.u-bordeaux.fr/~idurand/enseignement/PFS/Common/Strandh- Tutorial/indentation.html); el nivel de sangría en los formularios es suficiente para ver la estructura del código y, en cualquier caso, su editor debe equilibrar los parientes por usted. En segundo lugar, el código se escribe típicamente en minúscula; el intérprete te grita, pero no necesitas hacer lo mismo. Finalmente, creo que su firma de tipo debe ser 'SELECT-FROM-INNER-LIST :: [[a]] -> [a]'; el valor de retorno no es * necesariamente * una lista de listas. – 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)) 

como un principiante de Lisp, puedo enviar mi solución.

+1

Expandiría su respuesta un poco más. – ObieMD5

+0

Me gustaría ver su mejora, u otras. :) –

+0

Lo haría sin efectos secundarios, y en realidad devolvería el resultado en lugar de simplemente imprimirlo. Algo como '(defun dura (lista de listas) (loop para l en la lista de listas anexa (última l)))' – Inaimathi

Cuestiones relacionadas