a-list에 나타나는 an-element 횟수를 세는 함수를 작성했습니다. 나는 다양한 입력을 시도해 보았지만 그 프로파일을 만들었지 만 스택 사용 효율과 시간 효율성면에서 어떤 기능이 가장 좋은지 아직 알지 못합니다. 제발 도와주세요. 컴파일러/interperter이 꼬리 재귀 위해 그것을 optmize 수스택 사용 효율 및 시간면에서 가장 좋은 함수는
;; Using an accumulator
(defn count-instances1 [a-list an-element]
(letfn [(count-aux [list-aux acc]
(cond
(empty? list-aux) acc
:else (if (= (first list-aux) an-element)
(count-aux (rest list-aux) (inc acc))
(count-aux (rest list-aux) acc))))]
(count-aux a-list 0)))
;; Normal counting
(defn count-instances2 [a-list an-element]
(cond
(empty? a-list) 0
:else
(if (= (first a-list) an-element)
(+ 1 (count-instances2 (rest a-list) an-element))
(count-instances2 (rest a-list) an-element))))
;; using loop. does this help at all?
(defn count-instances3 [a-list an-element]
(loop [mylist a-list acount 0]
(if (empty? mylist)
acount
(if (= (first mylist) an-element)
(recur (rest mylist)(inc acount))
(recur (rest mylist) acount)))))
프로파일 작업의 결과는 무엇입니까? –
중첩 된'defn'은 아마도 당신이 생각하는 것을하지 않을 것입니다. 'defn'은 항상 최상위 함수를 정의합니다. 내부 함수를 정의하고 싶다면'letfn' (또는'(let [f (fn ...)])을 사용할 수 있습니다. –
브라이언에게 감사드립니다. 하지만 나는 일할 수있는 letfn을 얻을 수 없습니다. Letfn으로 내 질문을 편집 할 수 있습니까? 고마워. – unj2