相关疑难解决方法(0)

为什么JVM仍然不支持尾调用优化?

jvm-prevent-tail-call-optimization之后两年,似乎有一个原型 实现,MLVM已经将该功能列为"proto 80%"一段时间了.

Sun的/ Oracle方面是否没有积极的兴趣支持尾调用,或者只是尾部调用" 在每个功能优先级列表中排在第二位 [...]"如JVM所述语言峰会

如果有人测试了MLVM构建并且可以分享它的工作原理(如果有的话),我会非常感兴趣.

更新: 请注意,像Avian这样的某些虚拟机支持正确的尾部调用,没有任何问题.

java language-agnostic optimization jvm tail-call-optimization

95
推荐指数
4
解决办法
2万
查看次数

当规定额外允许空间为O(1)时,这意味着什么?

如果给出了编程问题中的上述条件并且我使用递归来解决它,那么我是否违反了约束条件?这可能是因为递归也使用堆栈?这样对吗?

algorithm recursion complexity-theory asymptotic-complexity

20
推荐指数
4
解决办法
2280
查看次数

Clojure - 使用recur vs普通递归函数调用

为什么Clojure有"复发"特殊形式?

当我用函数本身替换"recur"时,我得到相同的结果:

(defn print-down-from [x]
  (when (pos? x)
    (println x)
    (recur (dec x))
    )
  )
(print-down-from 5)
Run Code Online (Sandbox Code Playgroud)

结果与...相同

(defn print-down-from [x]
  (when (pos? x)
    (println x)
    (print-down-from (dec x))
    )
  )
(print-down-from 5)
Run Code Online (Sandbox Code Playgroud)

我想知道"recur"是否只是一个安全措施,因此如果开发人员碰巧使用非尾递归,编译器将抛出错误.或者编译器可能需要优化尾递归?

但我最想知道的是除了堆栈消费之外的任何其他原因.

recursion clojure

7
推荐指数
1
解决办法
2005
查看次数

由于拉链和HOF,递归是一种气味(在惯用的Clojure中)吗?

经典着作The Little Lisper(The Little Schemer)建立在两大创意之上

  1. 您可以以递归方式解决大多数问题(而不是使用循环)(假设您有尾调用优化)
  2. Lisp非常棒,因为它本身很容易实现.

现在人们可能会认为这适用于所有Lispy语言(包括Clojure).麻烦的是,这本书是当时的人工制品(1989年),可能在我们今天拥有的高阶函数功能编程(HOF)之前(或者至少被认为适合本科生).

递归(至少部分)的好处是可以轻松遍历嵌套数据结构('a 'b ('c ('d 'e))).

对于例如:

(def leftmost
  (fn [l]
    (println "(leftmost " l)
    (println (non-atom? l))
    (cond
      (null? l) '()
      (non-atom? (first l)) (leftmost (first l))
      true (first l))))
Run Code Online (Sandbox Code Playgroud)

现在使用Functional Zippers - 我们有一种非递归方法来遍历嵌套数据结构,并且可以像任何惰性数据结构一样遍历它们.对于例如:

(defn map-zipper [m]
  (zip/zipper 
    (fn [x] (or (map? x) (map? (nth x 1))))
    (fn [x] (seq (if (map? x) x (nth x 1))))
    (fn …
Run Code Online (Sandbox Code Playgroud)

recursion idiomatic clojure zipper higher-order-functions

5
推荐指数
1
解决办法
232
查看次数