4clojure
nth 구현 (no.21)
- nth를 쓰지 않고 nth를 구현해보기, 우선 nnth를 구현해봤다.
(defn nnth [c n]
(if (= n 0)
(first c)
(nnth (rest c) (dec n))))
답
(fn [c n]
(if (= n 0)
(first c)
(recur (rest c) (dec n))))
- 익명함수로 수정, 재귀를 위해 recur를 사용
- 다 풀고 다른 사람의 솔루션을 보았는데, 비슷하다.
count 구현 (no.22)
- count를 쓰지 않고 count를 구현해보기, 우선 countt를 구현해봤다.
(defn countt
([c n]
(if (empty? c)
n
(countt (rest c) (inc n))) )
([c]
(countt c 0)))
- 문제는 fn 노테이션을 잘 구현하지 못하겠는데,
loop
과recur
,꼬리재귀
를 이번 참에 잘 정리하고 가야겠다. - argument에
:or
노테이션이 있는데, 이것도 잘 정리해봐야겠다.
답 (loop, recur 활용)
loop
과recur
사용- 다중 인자는 받지 않음 (fn 구문에서는 defn과 같은 노테이션이 지원되지도 않음)
(fn [c]
(loop [cc c
n 0]
(if (empty? cc)
n
(recur (rest cc) (inc n)))))
- loop, recur, 꼬리재귀 내용은 => Clojure-usage
- 모범답안 풀이는 약간 충격적이었다.
아 이렇게해도 되는구나 ㅜㅜ
#(reduce + (map (constantly 1) %))
reverse 구현 (no.23)
reverse, rseq쓰지 않고 reverse 구현하기. 역시나 재귀를 쓰지 않고 간단히 할 방법을 찾고 있었는데... 그냥 into자체가 거꾸로 내뱉네;; 뭐지 into..?
;; 내가 푼 재귀
(fn [c]
(loop [nl []
cc c]
(if (empty? cc)
nl
(recur (cons (first cc) nl) (rest cc)))))
;; into를 사용한 것
#(into () %)
예:
(#(into () %) [1 2 3 4 5])
(5 4 3 2 1)
- into는 최대 3개의 인자를 받는데, 그 때마다 동작이 조금씩 다르니 참고하자.