Гарантируется ли оптимизация хвостовой рекурсии в Scala, когда это возможно? - PullRequest
3 голосов
/ 17 ноября 2011

Предположим, у меня есть следующий код

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

Гарантируется ли, что компилятор выполняет оптимизацию хвостовой рекурсии?

Ответы [ 2 ]

12 голосов
/ 17 ноября 2011

Да.Чтобы знать наверняка, добавьте аннотацию @tailrec в ваш метод.Это заставит компилятор выдать ошибку, если он не компилируется с использованием хвостовой рекурсии.

@tailrec
def foo(x:Int):Unit = {
  if (x == 1) println ("done")
  else foo(scala.util.Random.nextInt(10))
}
3 голосов
/ 17 ноября 2011

Нет , тип возврата 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

Вы должны иметь рекурсивный вызов в качестве последнего вызова, тип возврата не имеет значения.

Ваш код в вопросе в порядке, но название вопроса может вводить в заблуждение.

...