clojure trouver le dernier élément sans l'aide de la dernière fonction
Je suis en train d'apprendre clojure et ont été à l'aide de 4clojure.com à aller mieux. Je viens de terminer #19 mais il semble que peut-être que je ne l'ai pas fait tout à fait que l'auteur a prévu - comme je l'ai peut-être raté le point en quelque sorte.
Compte tenu de la contrainte que vous ne pouvez pas utiliser la dernière fonction cela vous semble comme une solution raisonnable?
#(.get %(- (count %) 1))
- Si elle vous fait vous sentir mieux, j'ai fait presque la même chose, sauf que j'ai utilisé
nth
.4clojure
est grand! - À mon humble avis, cette approche est juste pour faire fonctionner autour de la restriction, mais pas vraiment acceptable en tant que tâche d'apprentissage. L'apprentissage de la programmation fonctionnelle est à propos de l'apprentissage d'une nouvelle façon de résolution de problèmes et la pensée en général.
object something = list.get(n - 1);
est pas tout à fait ça, est-il? Je vous suggère de regarder la réponse par @Alex Taggart.
Vous devez vous connecter pour publier un commentaire.
C'est une solution valable. Je voudrais aller avec
#(nth % (dec (count %)))
comme étant plus idiomatique, mais ils sont fonctionnellement équivalents.dec
fonction en Clojure qui décrémente est un indice.Si vous allez utiliser:
Vous pouvez ainsi composer la fonction avec "comp":
C'est sans doute un peu plus idiomatiques et plus facile à lire. La même mise en garde à propos de "reverse" de ne pas être paresseux s'applique ici.
Ce sujet
Dans le vide
Ici est purement récursive approche qui ne repose pas sur le comptage:
end
qui renvoie le dernier élément dans une séquence. Ce que vous cherchez est:(fn [[n & more]] (if more (recur more) n))
Ouais c'est une solution raisonnable. Quelques choses bien:
C'est plus idiomatique utiliser la fonction
dec
au lieu de soustraire par un.#(.get % (dec (count %)))
Suivre d'autres personnes sur 4clojure. De cette façon, vous pouvez voir leurs solutions au problème après le résoudre. Je suis en train de travailler à travers 4clojure moi-même et il est très utile d'apprendre à propos de la langue, en particulier de certaines expressions idiomatiques.
La première solution que j'ai pensé serait juste pour inverser la liste et de prendre le premier élément.
#(first (reverse %))
reverse
ne serait pas la grande (car il reprend la séquence en mémoire), mais c'est d'un banal petit problème qui est un peu hors de propos. Aussi,nth
est plus idiomatique que.get
.count/nth
solution est tout aussi non-paresseux comme unreverse
solution: les deux échouent sur de très grandes séquences d'entrée. Et malheureusement, @ivant, un paresseux inverse d'un paresseux de la séquence n'est pas possible.reverse
permet de dupliquer la structure (il peut être plus intelligent pour un vecteur aléatoire de l'accès, mais il ne peut pas être une liste ou d'arbitraire seq). Lecount
/nth
solution ne devriez pas échouer pour tout ce qui peut tenir dans la mémoire.rseq
qui vient accède à la collection dans l'ordre inverse en place. Bien sûr, la collection doit être alors un accès aléatoire et limitée, comme vecteur.Je pense que vous pouvez obtenir encore plus simple avec quelque chose comme
(comp peek vec)
. Je pense que le problème est quelast
est de travailler avec des séquences et des œuvres dans le temps linéaire comme le dit la documentation:peek
sur l'autre main est plus rapide quelast
selon les docs:(vec)
à θ(n) plus n(peek)
s à θ(1) est en θ(n) alors n(last)
s à θ(n) est θ(n2). Il peut également payer de différentes façons d'écrire un code lisible 😉Je ne pense pas que ma solution est mieux que n'importe qui d'autre, mais je pense que c'est une autre façon de résoudre le même problème:
C'est à l'aide de la
fn
.