其功能是最好的堆栈使用效率和时间方面(Which Function is the best in t

2019-09-20 07:33发布

我写了3个函数算一个元素出现在名单的次数。 我尝试了各种输入和异形,但我仍然不知道哪些功能是天下最好的堆栈使用效率和时间效率上。 请帮助我。

;; 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)))))

Answer 1:

循环/易复发的版本是正确的方式。 Clojure中不能优化尾调用由于JVM的限制。



Answer 2:

写你的代码,所以编译器/ interperter可以租期,提高它的尾递归,应导致一些性能提升和堆栈用量减少。 我觉得你的正常计数功能可能有资格获得尾递归,这样一个应该是相当快的。 不知道,因为我只在涉足的Lisp作为一种业余爱好。

http://en.wikipedia.org/wiki/Tail_recursion



文章来源: Which Function is the best in terms of Stack Usage Efficiency and Time