Obtenir le Dernier Élément de chaque liste
Disons que j'ai une liste ((3 4 5) (d e f) (h i j) (5 5 5 5))
Comment puis-je obtenir le dernier élément de chaque liste, de telle façon que la sortie devrait ressembler à ceci (5 f j 5)?
- regarde comme des devoirs..
Vous devez vous connecter pour publier un commentaire.
En supposant que ce est à propos de Common Lisp, il y a une fonction dernière qui renvoie une liste contenant le dernier élément d'une liste. Si vous utilisez cette fonction avec mapcan, qui applique une fonction à chaque élément d'une liste et retourne la concaténation de résultats, vous obtiendrez ce que vous voulez.
Notez bien que l'accès au dernier élément d'une liste est un
O(N)
opération, donc, si ce n'est pas seulement les devoirs après tout, vous pourriez envisager si vous ne pouvez pas résoudre le problème réel de manière plus efficace que de prendre le dernier élément de chaque liste (peut-être utiliser un autre discbased à la place).last
renvoie une liste).mapcan
est un très mauvaise idée, surtout pour les débutants.mapcan
, j'arrive à la fin de la définition d'un équivalent fonctionnel. Il faut vraiment être nommémapcan!
, parce qu'elle modifie de façon destructrice de ses arguments de la liste.Cela, comme la plupart des premiers LISPy devoirs des problèmes est un exercice de pensée de manière récursive et/ou de la pensée en termes d'induction. La façon de commencer est de se poser des questions simples que vous pouvez répondre facilement.
Par exemple, si on vous avait demandé d'écrire quelque chose qui vous a donné le premier élément de chaque liste, je serais chose à propos de cette façon:
Donné une liste de listes:
'()
? (facilenull
)'(a)
? (facilea
, ou peut-être une erreur)'((a))
? (facile(a)
)'(anything)
, où tout est une liste? (facile(first anything)
)'(anything morestuff)
? (facile(cons (first anything) (first-element morestuff))
)nil
.(car list)
De là, nous pouvons commencer à écrire du code:
Maintenant, ce n'est pas vos devoirs (intentionnellement). Vous devez jouer avec cela et comprendre comment il fonctionne. Votre prochain objectif devrait être de trouver comment cela diffère de votre travail et comment s'y rendre.
À l'égard de MAPCAR? Ne vous inquiétez pas à ce sujet. Vous avez besoin d'apprendre à résoudre récursive problèmes en premier. Ensuite, vous pouvez vous soucier de MAPCAR. Quel est le point de cette mission? Pour vous aider à apprendre à penser dans ce mode. Dang proximité tout en LISP/Scheme est résolu en réfléchissant de cette manière.
La raison pour laquelle je suis allé avec toutes les questions de le décomposer en parties que je suis inquiet. Si je me suis donné pour tâche de "comment dois-je faire foo sur chaque élément dans une liste?" Je dois répondre à ces questions: Comment dois-je faire gérer la valeur null? Comment faire gérer un atome? Comment dois-je faire de la poignée sur le premier élément de la liste? Comment puis-je gérer tout le reste? Une fois j'ai répondu que, puis-je savoir comment faire foo. Comment dois-je faire foo sur null? Comment dois-je faire foo sur un atome? Comment dois-je faire foo sur une liste?
Écrire une procédure qui renvoie le dernier élément d'une liste, puis d'en apprendre un peu sur le haut-
MAP
(un.k.un.MAPCAR
) procédure et voir si toutes les ampoules s'éteignent.probablement, il est déjà résolu, mais j'ai compris cela
Maintenant, cela fonctionne pour la pièce de théâtre de la liste...donc si vous appelez la fonction SFIL avec une bonne liste.... si non, il va retourner NIL
j'espère que ce sera utile, pour toute personne qui le trouve
SELECT-FROM-INNER-LIST :: [[a]] -> [a]
; la valeur de retour n'est pas forcément va être une liste de listes.comme un débutant de lisp, je poste ma solution.
(defun lasts (list-of-lists) (loop for l in list-of-lists appending (last l)))