我知道在JavaScript中进行递归调用函数时应该小心谨慎,因为第二次调用可能会慢上多达10倍。
有一个重要的问题:在大多数JavaScript实现中,第二个版本比第一个版本慢约10倍。在JavaScript中,运行简单的循环比多次调用函数要便宜得多。
John Resig甚至在这篇文章中也提到了这个问题。
我的问题是:为什么使用递归效率如此低下?这只是特定引擎的构建方式吗?我们是否会在JavaScript中看到这种情况不再存在的时候?
我知道在JavaScript中进行递归调用函数时应该小心谨慎,因为第二次调用可能会慢上多达10倍。
有一个重要的问题:在大多数JavaScript实现中,第二个版本比第一个版本慢约10倍。在JavaScript中,运行简单的循环比多次调用函数要便宜得多。
John Resig甚至在这篇文章中也提到了这个问题。
我的问题是:为什么使用递归效率如此低下?这只是特定引擎的构建方式吗?我们是否会在JavaScript中看到这种情况不再存在的时候?
由于所有涉及更改堆栈和设置新上下文等的开销,函数调用比简单循环更加昂贵。为了使递归非常有效,语言必须支持某种形式的尾调用消除,这基本上意味着将某些递归函数转换为循环。OCaml、Haskell和Scheme等函数式语言做到了这点,但我所知道的JavaScript实现都没有这样做(除非它们全部都这样做,否则这只会略微有用,所以也许我们面临哲学家就餐问题)。