Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果可能,Scala是否保证尾部递归优化?_Scala_Tail Recursion - Fatal编程技术网

如果可能,Scala是否保证尾部递归优化?

如果可能,Scala是否保证尾部递归优化?,scala,tail-recursion,Scala,Tail Recursion,假设我有以下代码 def foo(x:Int):Unit = { if (x == 1) println ("done") else foo(scala.util.Random.nextInt(10)) } 是否保证编译器进行尾部递归优化?是。要确切知道,请将@tailrec注释添加到方法中。如果编译器不使用尾部递归进行编译,这将导致编译器抛出错误 @tailrec def foo(x:Int):Unit = { if (x == 1) println ("done") e

假设我有以下代码

def foo(x:Int):Unit = {
   if (x == 1) println ("done")
   else foo(scala.util.Random.nextInt(10))
}

是否保证编译器进行尾部递归优化?

是。要确切知道,请将
@tailrec
注释添加到方法中。如果编译器不使用尾部递归进行编译,这将导致编译器抛出错误

@tailrec
def foo(x:Int):Unit = {
  if (x == 1) println ("done")
  else foo(scala.util.Random.nextInt(10))
}

单元
返回类型不相关

scala> @tailrec def f(i: Int) { if (i >= 0) { println(i); f(i - 1) }  }
f: (i: Int)Unit
但是:

scala>@tailrecdef f(i:Int){if(i>=0){f(i-1);println(“.”}
:11:错误:无法优化@tailrec注释的方法f:
它包含一个不在尾部位置的递归调用
您需要将递归调用作为最后一个调用,返回类型无关紧要


您在问题中的代码很好,但问题的标题可能会误导您。

我不知道Scala能为您提供什么保证,但在一般情况下,JVM不会实现尾部递归。(tailrec调用没有JVM字节码)@Basile Starynkevitch:Scala可以编译简单的尾部递归到循环的例子。有些JVM“自动”支持尾部递归,但不幸的是Oracle不支持。在Scala 2.8中,我不得不导入Scala.annotation.tailrec。尝试打破它。在方法的底部添加一个额外的()以便它在调用后执行某些操作,但仍然返回单位。我的意思是你的建议有效,我只需要添加导入。不用担心。我第一次就知道了。我的意思是,如果没有一个正确的尾部递归函数,您应该使用它并查看编译器是否会出错。
scala> @tailrec def f(i: Int) { if (i >= 0) { f(i - 1); println(".") }  }
<console>:11: error: could not optimize @tailrec annotated method f:
  it contains a recursive call not in tail position