假設我有以下代碼在Scala中可以保證尾遞歸優化嗎?
def foo(x:Int):Unit = {
if (x == 1) println ("done")
else foo(scala.util.Random.nextInt(10))
}
能夠保證所有的編譯器做尾遞歸優化?
假設我有以下代碼在Scala中可以保證尾遞歸優化嗎?
def foo(x:Int):Unit = {
if (x == 1) println ("done")
else foo(scala.util.Random.nextInt(10))
}
能夠保證所有的編譯器做尾遞歸優化?
沒有,則Unit
返回類型是無關緊要的。
scala> @tailrec def f(i: Int) { if (i >= 0) { println(i); f(i - 1) } }
f: (i: Int)Unit
但是:
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
你需要有遞歸調用的最後一次通話,返回類型並不重要。
你在問題中的代碼是好的,但問題的標題會誤導。
同意。我編輯了標題。感謝您的反例。 – Jus12
我不知道Scala保證你什麼,但是在JVM的一般情況下並不實現尾遞歸。 (對於tailrec調用沒有JVM字節碼) –
@Basile Starynkevitch:Scala可以編譯簡單的尾循環遞歸循環。一些JVM支持「自動」尾部遞歸,但不幸的是Oracle不支持。 – Landei