6

我是 scala 的新手,我目前正在工作表中练习。我注意到@tailrec 在工作表中不起作用,即使我添加了导入

import scala.annotation.tailrec

这是我正在使用的 scala 版本

Scala code runner version 2.10.2 -- Copyright 2002-2013, LAMP/EPFL

有没有办法让它工作?谢谢

4

3 回答 3

9

您描述的问题是 Scala 的 Eclipse IDE 中的一个错误: https ://scala-ide-portfolio.assembla.com/spaces/scala-ide/tickets/1001636#/activity/ticket

解决方法是将 @tailrec 放在 def 或不同的对象中。

例如:

package tailrecfunc

import scala.annotation.tailrec

object Session17 {
  val block = {
    @tailrec
    def tailrecfunc(n: Int): Int =
     if(n == 0) n; else tailrecfunc(n - 1)

    tailrecfunc(4)
  }                                          
}

这样,当函数不是尾递归时,scala解释器会警告你

于 2013-11-10T22:07:37.043 回答
4

请注意,您不要弄错@tailrec注释的工作方式 - 它不会强制编译器以“尾递归方式”优化函数(如果可以的话,编译器无论如何都会进行优化)。

相反,它只是一个标记,您可以用来告诉编译器“我认为这个函数已经以尾递归方式成功编写,请告诉我您是否不能以这种方式优化它。”

也就是说,在你想确保你已经正确编写了一个旨在尾递归的函数的地方使用它,并且编译器可以在你出错时指出。

这对你所看到的有意义吗?如果没有看到您使用注释的示例代码,我不能说任何更有用的东西。

于 2013-09-22T13:55:53.310 回答
1

首先定义并存根你要注解的函数,然后返回并添加注解。

于 2013-09-21T17:54:21.210 回答