检测编程语言中的尾递归

时间:2015-04-06 02:07:42

标签: java javascript c# recursion tail-recursion

这个问题有部分答案herehere,似乎隐含地暗示javascript和python会导致'无限递归'。

背景

最近我一直在涉及尾部递归,我目前的理解是,编程风格(*通常)具有等效迭代解决方案的性能优势,并具有可读性 - 从而使其成为两个世界中最好的

实施例

我注意到如果要在.NET或Java中执行此操作:

while(true) {...}

最终,Windows会弹出一个对话框,允许机器用户更改此类可执行文件的状态:

The famous windows not responding dialog box

问题

由于尾​​递归(*实际上)不必在这里处理stackoverflow异常,我是不正确的假设Java或C#会:

  1. 触发“Foo.exe无响应”对话框
  2. 导致无限递归
  3. 此外,我认为这个运行时'异常'将由语言的解释器处理,这是正确的吗?

1 个答案:

答案 0 :(得分:3)

  

由于尾​​递归(*实际上)不必在这里处理stackoverflow异常,我是不正确的假设Java或C#要么......

这包含不正确的假设。

尾递归只是源代码中的一种模式。

尾部递归优化将递归代码转换为迭代的代码......在幕后。优化需要由编译器 1 执行。

当前一代的Java编译器(字节码和JIT)热点实现进行尾递归优化。这有与安全相关的原因。


但忽略了这一点:

  

我不认为Java或C#会:

     
      
  1. 触发“Foo.exe无响应”对话框
  2.   
  3. 导致无限递归
  4.   

还有第三种情况。它可以进入一个无限循环,而不会触发“无响应”警报。我的理解是,只有在操作系统检测到应用程序未在一定秒数内“消耗”或“响应”待处理的GUI事件时,才会显示该警报。

我希望在以下场景中出现第三种情况:

  • 测试应用程序没有GUI
  • 测试应用程序不在事件线程上运行递归测试
  • 用户不会尝试以任何方式与测试应用程序GUI进行交互
  

此外,我认为这个运行时'异常'将由语言的解释器处理,这是正确的吗?

如果Java中存在“堆栈溢出”事件,则JVM运行时会将其转换为StackOverflowError异常。无论是解释器还是“其他”,都取决于...当时是否正在解释代码。

引发的异常是应用程序本身“处理”...或忽略。


1 - 为了迂腐,你可以在源代码级别手动执行优化,但是你的源代码不是递归的......