Napisałem 3 funkcje, które zliczają ile razy pojawia się element-a na liście. Próbowałem różnych wejść i profilowałem to, ale nadal nie wiem, która funkcja jest najlepsza pod względem wydajności użycia stosu i wydajności czasu. Proszę pomóż mi.Która funkcja jest najlepsza pod względem wydajności i czasu użytkowania stosu
;; 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)))))
Jakie były wyniki Twoich działań profilujących? –
Zagnieżdżone 'defn' prawdopodobnie nie robi tego, co myślisz. 'defn' zawsze definiuje funkcję najwyższego poziomu. Możesz użyć 'letfn' (lub nawet' (let [f (fn ...)]) ') jeśli chcesz zdefiniować wewnętrzną funkcję. –
Dzięki Brian. Ale nie mogę pozwolić, żeby letfn zadziałał. Czy mógłbyś edytować moje pytanie z letfn? Wielkie dzięki. – unj2