如何在Scala中确定是否可以通过尾递归来解决问题

时间:2019-02-04 04:59:59

标签: scala recursion functional-programming tail-recursion

如何确定是否可以通过尾部递归来解决问题陈述。问题的任何特征可以用来识别吗?

1 个答案:

答案 0 :(得分:3)

尾递归可以表示循环,因此可以通过循环解决的任何问题也可以通过尾递归来解决:

@scala.annotation.tailrec
def myWhile(condition: => Boolean)(body: => Unit): Unit = 
  if (condition) { body; myWhile(condition)(body) }

var i = 0

myWhile { i < 10 } { i += 1; println(i) }
// 1
// 2
// 3
// 4
// 5
// 6
// 7
// 8
// 9
// 10

特别是,表达 iteration 与尾递归非常自然:

def processElement[A, B](el: A)(restOfTheElements: Traversable[A]): B = {
  doSomethingWithEl
  val (nextElement, newRest) = doSomethingToGetNextElement(restOfTheElements)
  processElement(nextElement)(newRest)
}

事件循环(例如GUI,Web服务器,操作系统内核)自然是尾部递归的:

def processEvent[A](event: A)(eventPump: EventPump[A]): Unit = {
  doSomethingWithEvent
  processEvent(eventPump.nextEvent)(eventPump)
}

此外,仅包含WHILE循环的语言是图灵完备的,因此可以使用尾递归至少 来计算自然数上的每个图灵可计算函数。 / p>