Diciamo che ho una lista ((3 4 5) (d e f) (h i j) (5 5 5 5))
Get ultimo elemento di ogni lista
Come posso ottenere l'ultimo elemento di ciascuna lista in modo tale che l'uscita sarebbe simile a questa (5 f j 5)?
Diciamo che ho una lista ((3 4 5) (d e f) (h i j) (5 5 5 5))
Get ultimo elemento di ogni lista
Come posso ottenere l'ultimo elemento di ciascuna lista in modo tale che l'uscita sarebbe simile a questa (5 f j 5)?
Scrivere una procedura che restituisce l'ultimo elemento di una lista, quindi imparare un po 'sulla procedura integrata MAP
(a.k.a. MAPCAR
) e vedere se alcune lampadine si spengono.
In Common-Lisp, le funzioni integrate LAST e MAPCAN possono anche essere piuttosto utili. –
Supponendo che si tratti di Common Lisp, esiste una funzione last che restituisce un elenco contenente l'ultimo elemento di un elenco. Se si utilizza questa funzione con mapcan, che applica una determinata funzione a ciascun elemento di un elenco e restituisce i risultati concatenati, otterrete ciò che si desidera.
Nota che accedere all'ultimo elemento di un elenco è un'operazione O(N)
, quindi se non si tratta solo di compiti a casa, si potrebbe voler considerare se non è possibile risolvere il problema reale in modo più efficiente rispetto all'ultimo elemento di ciascuna lista (magari usare un'altra struttura dati).
Grazie per questa risposta, ma puoi darmi ulteriori informazioni al riguardo. come il modo in cui MAPCAR è usato. Mi spiace di chiederlo, ma questo è solo il mio primo tentativo di sviluppo nella mia spiacevole speranza che voi ragazzi potete aiutarmi di più su questo..Grazie in anticipo..btw, im usando la chiarezza comune e mi spiace di pubblicare la mia risposta come risposta. –
Ho aggiunto collegamenti alla documentazione per le funzioni menzionate. Quelli contengono esempi. – sepp2k
Ciao! sono stato in grado di fare un lavoro in qualche modo il mio modo di want.this è il mio codice (lastelements defun (L) \t (se L \t \t (accodare (ultima (prima L)) (lastelements (riposo L))) \t) ) ma ho piccola problem..When i ingresso '((4) (ciao (mondo))) che l'output è qualcosa di simile ((4) ((mondo))) ma dall'esempio dare in uscita nel nostro esercizio dovrebbe assomigliare a questo (4 (mondo)) .. Grazie in anticipo! –
Questo, come la maggior parte dei primi problemi con i compiti a casa LISPy, è un esercizio di pensiero ricorsivo e/o di pensiero in termini di induzione. Il modo per iniziare è porsi semplici domande a cui puoi rispondere facilmente.
Per esempio, se tu fossi stato chiesto di scrivere qualcosa che ti ha dato il primo elemento in ogni lista, vorrei cosa in questo modo:
data una lista di liste:
'()
? (facile - null
)'(a)
? (facile - a
, o forse un errore)'((a))
? (facile - (a)
)'(anything)
, dove tutto è un elenco? (facile - (first anything)
)'(anything morestuff)
? (facile - (cons (first anything) (first-element morestuff))
)nil
.(car list)
Da qui possiamo iniziare la scrittura di codice:
;; 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
Ora, questo non è il vostro lavoro (intenzionalmente). Dovresti giocare con questo e capire come funziona. Il tuo prossimo obiettivo dovrebbe essere scoprire come questo differisce dal tuo incarico e come arrivarci.
Per quanto riguarda MAPCAR? Non preoccuparti per questo Devi imparare come risolvere prima i problemi ricorsivi. Quindi puoi preoccuparti di MAPCAR. Qual è il punto di questo incarico? Per aiutarti a imparare a pensare in questa modalità.Dang vicino a tutto il in LISP/Schema è risolto pensando in questo modo.
La ragione per cui sono andato con tutte le domande per scomporlo nelle parti di cui sono preoccupato. Se mi viene assegnato il compito "come faccio a fare a meno su ogni elemento in una lista?" Dovrei rispondere alle domande: come posso gestire nulla? Come gestire un atomo? Come posso gestire il primo elemento dell'elenco? Come gestisco tutto il resto? Una volta che ho risposto a questo, allora capisco come fare veramente a foo. Come faccio a foo su null? Come faccio a fare foo su un atomo? Come faccio a fare una lista?
probabilmente è già risolto, ma ho capito questo
; SELECT-FROM-INNER-LIST :: [list] -> [list]
(DEFUN SFIL (lst)
(COND ((NULL lst) NIL)
((LISTP (FIRST lst)) (APPEND (LAST (FIRST lst)) (SFIL (REST lst))))
))
Ora, questo funziona per lista legit ... quindi se si chiama la funzione SFIL con elenco corretto .... in caso contrario, lo farà tornare NIL
speriamo che questo sarà utile, per chi lo trova
Alcuni commenti: in primo luogo, di norma, [non mettere i parenti di chiusura su linee separate] (http://dept-info.labri.u-bordeaux.fr/~idurand/enseignement/PFS/Common/Strandh- Tutorial/indentation.html); il livello di indentazione nei moduli è sufficiente per vedere la struttura del codice e il tuo editor dovrebbe essere in ogni caso in grado di bilanciare parens. Secondo, il codice è tipicamente scritto in minuscolo; l'interprete ti grida, ma non devi fare lo stesso. Infine, penso che il tuo tipo di firma dovrebbe essere "SELECT-FROM-INNER-LIST :: [[a]] -> [a]'; il valore di ritorno non è * necessariamente * un elenco di liste. – 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))
come un principiante di Lisp, ho posto la mia soluzione.
Vorrei ampliare ancora una volta la tua risposta. – ObieMD5
Mi piacerebbe vedere il tuo miglioramento, o altri. :) –
Lo farei senza effetti collaterali e restituirei effettivamente il risultato anziché semplicemente stamparlo. Qualcosa come '(defun dura (lista-di-liste) (loop per l in lista di liste di accodamento (ultimo l)))' – Inaimathi
sembra come fare i compiti .. – nothrow