简单的尾递调优化,用于递归的while循环样式函数

时间:2017-10-21 04:13:35

标签: javascript

我有一个简单的功能:

const stackOverflow = (n = 0) =>
  n === 10000 ? 'cool' : stackOverflow(n + 1)

https://jsfiddle.net/dsso9pg6/

当我运行此操作时,我遇到"超出最大调用堆栈大小" 错误。我已经读过这些类型的递归函数可以用不同的方式编写,以避免在调用堆栈中出现这个问题(与#34;尾调用优化" ...有关),但我没有&#39我很清楚问题所在。

如何在避免错误的同时保留同样的递归函数结构?

编辑:或者这已经是尾调优化? (我在Node.js 8.6和Chrome 61中看到了错误,但Safari 11并没有抱怨并返回"很酷。")

1 个答案:

答案 0 :(得分:2)

你做对了,程序编程中的while循环可以用函数式编程范例中的递归代替。因此,一种称为"尾调用优化的技术"是在一些函数式编程语言(例如Haskell)中发明的,用于处理这些场景中的长调用栈。

javascript中的最大调用堆栈还取决于运行时环境:例如,在我的浏览器中它是30000,但这可能会有所不同。所以你的代码在我的浏览器中工作正常,而不是抛出错误。但是这个想法是有一个上限,尾调优化可以消除它。

然而,尾部调用优化是语言引擎级别支持的功能,并且在后台运行而不是我们可以使用的功能。不幸的是,javascript并不是真正的FP语言,所以它还不支持这个功能。希望,当ES6最终确定时,我们可以拥有这个很酷的功能并完全使用函数式编程。

编辑:您可以在这里检查您的运行时环境是否支持TCO(看起来Safari已经支持它)

https://kangax.github.io/compat-table/es6/