Ich schrieb 3 Funktionen, die zählen, wie oft ein Element in einer Liste erscheint. Ich habe verschiedene Eingänge ausprobiert und profiliert, aber ich weiß immer noch nicht, welche Funktion hinsichtlich Stapeleffizienz und Zeiteffizienz am besten ist. Bitte hilf mir.Welche Funktion ist die beste in Bezug auf Stack Usage Efficiency und Zeit
;; 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)))))
Was waren die Ergebnisse Ihrer Profilierungsbemühungen? –
Verschachtelt 'defn' macht wahrscheinlich nicht, was Sie denken. 'defn' definiert immer eine Toplevel-Funktion. Sie können 'leftn' (oder sogar' (lassen Sie [f (fn ...)]) ') verwenden, wenn Sie eine innere Funktion definieren möchten. –
Danke Brian. Aber ich kann den Letfn nicht zur Arbeit bringen. Könntest du meine Frage mit Letfn bearbeiten? Danke vielmals. – unj2