这个问题有部分答案here和here,似乎隐含地暗示javascript和python会导致'无限递归'。
背景
最近我一直在涉及尾部递归,我目前的理解是,编程风格(*通常)具有等效迭代解决方案的性能优势,并具有可读性 - 从而使其成为两个世界中最好的
实施例
我注意到如果要在.NET或Java中执行此操作:
while(true) {...}
最终,Windows会弹出一个对话框,允许机器用户更改此类可执行文件的状态:
问题
由于尾递归(*实际上)不必在这里处理stackoverflow异常,我是不正确的假设Java或C#会:
此外,我认为这个运行时'异常'将由语言的解释器处理,这是正确的吗?
答案 0 :(得分:3)
由于尾递归(*实际上)不必在这里处理stackoverflow异常,我是不正确的假设Java或C#要么......
这包含不正确的假设。
尾递归只是源代码中的一种模式。
尾部递归优化将递归代码转换为迭代的代码......在幕后。优化需要由编译器 1 执行。
当前一代的Java编译器(字节码和JIT)热点实现不进行尾递归优化。这有与安全相关的原因。
但忽略了这一点:
我不认为Java或C#会:
- 触发“Foo.exe无响应”对话框
- 导致无限递归
醇>
还有第三种情况。它可以进入一个无限循环,而不会触发“无响应”警报。我的理解是,只有在操作系统检测到应用程序未在一定秒数内“消耗”或“响应”待处理的GUI事件时,才会显示该警报。
我希望在以下场景中出现第三种情况:
此外,我认为这个运行时'异常'将由语言的解释器处理,这是正确的吗?
如果Java中存在“堆栈溢出”事件,则JVM运行时会将其转换为StackOverflowError
异常。无论是解释器还是“其他”,都取决于...当时是否正在解释代码。
引发的异常是应用程序本身“处理”...或忽略。
1 - 为了迂腐,你可以在源代码级别手动执行优化,但是你的源代码不是递归的......