Digamos que tengo una lista ((3 4 5) (d e f) (h i j) (5 5 5 5))
Consultar último elemento de cada lista
¿Cómo puedo obtener el último elemento de cada lista de tal manera que la salida sería el siguiente (5 f j 5)?
Digamos que tengo una lista ((3 4 5) (d e f) (h i j) (5 5 5 5))
Consultar último elemento de cada lista
¿Cómo puedo obtener el último elemento de cada lista de tal manera que la salida sería el siguiente (5 f j 5)?
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.
En common-lisp, las funciones incorporadas LAST y MAPCAN también pueden ser bastante útiles. –
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).
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. –
He agregado enlaces a la documentación de las funciones mencionadas. Esos contienen ejemplos. – sepp2k
¡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! –
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:
'()
? (fácil - null
)'(a)
? (fácil - a
, o tal vez un error)'((a))
? (fácil - (a)
)'(anything)
, donde todo es una lista? (fácil - (first anything)
)'(anything morestuff)
? (fácil - (cons (first anything) (first-element morestuff))
)nil
.(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?
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
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
(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.
Expandiría su respuesta un poco más. – ObieMD5
Me gustaría ver su mejora, u otras. :) –
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
parece una tarea .. – nothrow