我有一个尾递归寻路算法,我已经在Javascript中实现,并想知道是否有任何(所有?)浏览器可能会得到堆栈溢出异常.
我向所有人道歉,因为以前版本的这个模糊不清.有人决定对这个新女孩表示同情并帮我改写这个问题 - 这是一个我希望能够解决问题的更新(并且,感谢迄今为止所有那些慷慨解答的人):
问题
我是Uni的第一年,我是一名新的计算机科学专业的学生.对于我的算法类的最终项目,我们可以选择我们想要的任何语言,并实现一种"细化"/"效率"算法,该算法在本地(内部?)用另一种语言找到,但在我们选择的语言中缺失.
我们刚刚在课堂上研究了递归,我的教授简要地提到JavaScript没有实现Tail Recursion.从我的在线研究中,新的ECMA脚本6规范包含此功能,但它目前不在任何(/大多数?)JavaScript版本/引擎中?(对不起,如果我不确定哪个是......我是新来的).
我的任务是为缺少的功能提供2个(编码)WORK AROUND的选项.
所以,我的问题是......是否有人,比我更聪明,更有经验,对我如何实现以下方面有任何想法或例子:
解决了缺乏尾递归优化?
截至2019年2月71.0.3578.98在Mac上的Chrome版本中,以下程序 Uncaught RangeError: Maximum call stack size exceeded error.的计数为16516。
const a = x => {
console.log(x)
a(x + 1)
}
a(1)
Run Code Online (Sandbox Code Playgroud)
我已经做了很多Google搜寻工作,但找不到任何讨论Chrome或其他浏览器对尾部呼叫优化(TCO)支持或将来实现它的计划的文章。
我的两个问题是:
我发现的帖子大多是旧的(2016年或更早的版本)或令人困惑。例如https://www.chromestatus.com/feature/5516876633341952
此函数应该是尾调用优化.
据我所知,目前的浏览器(Chrome,甚至在Canary上尝试过)都应该对它进行优化,但是这次运行会出错:
function die(x, s) {
return x === 0 ? s : die(x-1, s+1);
}
die(100000, 0);
Run Code Online (Sandbox Code Playgroud)
错误:
VM369:1 Uncaught RangeError: Maximum call stack size exceeded
或者我弄错了什么?
javascript ×4
algorithm ×1
chromium ×1
ecmascript-6 ×1
firefox ×1
optimization ×1
recursion ×1
v8 ×1