在Scala中需要@tailrec注释?

参见英文答案 > What is the Scala annotation to ensure a tail recursive function is optimized?                                    3个
我理解递归函数的问题和堆栈溢出问题的风险.

但是,如果函数能够针对尾递归进行优化,那么为什么不会自动应用此优化,即.为什么我需要标记一个可以用@tailrec优化的函数

解决方法

if a function is able to be optimized for tail recursion then why isn’t this optimization automatically applied

它是.

不幸的是,我没有从SLS中找到一个可以保证这一点的报价.

why do I need to mark a function that can be optimized with @tailrec?

注意:Scala不保证函数的正确尾递归,仅适用于方法

您没有注释可以优化的方法.您注释必须优化的方法,以便在无法优化时出现编译错误.

the documentation for scala.annotation.tailrec

A method annotation which verifies that the method will be compiled with tail call optimization.

If it is present,the compiler will issue an error if the method cannot be optimized into a loop.

文档在确切优化的内容中具有误导性(“尾部调用优化”,当Scala真正优化直接尾递归时),但是注释的目的很清楚.

这种注释的原因在于,有时人们对什么是直接尾递归的直觉可能是错误的.这里有很多关于“为什么Scala不优化我的尾递归方法”的形式的问题,其答案是“因为它不是尾递归的”. (Here is an example of a method where the fact that it can’t be optimized is non-obvious.)因此,通过注释方法,您向编译器和您的开发人员发出信号,表明必须优化此方法.

相关文章

Scala的存在类型 存在类型也叫existential type,是对类型做抽象的一种方法。可以在你不知道具体类型的...
文章目录Option和SomeOption和NoneOption和模式匹配 在java 8中,为了避免NullPointerException,引入了...
文章目录泛类型型变协变逆变不变类型上界类型下界内部类抽象类型复合类型自类型隐式参数隐式转换多态方...
Scala的自定义类型标记 Scala中有很多千奇百怪的符号标记,看起来是那么的独特,就像是一杯dry martini...
文章目录面向对象的scalaUnified TypesClassesTraits 面向对象的scala 我们知道Scala是一种JVM语言,可...
文章目录默认参数值命名参数 scala的参数有两大特点: 默认参数值 命名参数 默认参数值 在Scala中,可以...