如何确定是否可以通过尾部递归来解决问题陈述。问题的任何特征可以用来识别吗?
答案 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>