【问题标题】:Stack overflow when no tail-recursion optimization in scala?scala中没有尾递归优化时堆栈溢出?
【发布时间】:2015-11-30 05:05:31
【问题描述】:

我正在自己从 scala 编译器源代码构建一个 scala 编译器。在编译器的源代码中,有很多尾递归函数/方法。从源代码构建 scala 编译器也需要编译编译器本身的源代码。如果我在编译源代码的时候加上选项-g:notailcalls关闭尾递归优化,运行编译好的编译器会出现statck溢出错误。

总之,在一个庞大而复杂的scala程序中,有很多递归调用,编译时忽略尾递归优化会导致运行时堆栈溢出错误吗?

【问题讨论】:

  • 当然可以查看issues
  • 是的,当然。关闭尾递归优化意味着对其他尾递归函数的递归调用会消耗之前没有的堆栈帧,因此占用更多堆栈并更有可能导致堆栈溢出。
  • 它不需要“大而复杂”的程序。试试看:def f(i: Int): Int = if (i == 0) i else f(i - 1); f(1000000)

标签: scala tail-recursion


【解决方案1】:

当然。但请注意,Scala 能够自行判断函数是否为尾递归,您无需将 @tailrec 注释传递给函数。

但是,scala 无法将合适的函数转换为其尾递归形式。您必须手动执行此操作,但并非每个功能都可以通过这种方式进行转换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    • 2020-03-06
    • 1970-01-01
    相关资源
    最近更新 更多