scala - 如何确定问题是否可以在 Scala 中使用尾递归解决
问题描述
如何确定是否可以通过尾递归解决问题陈述。是否有任何可以识别的问题特征?
解决方案
尾递归可以表达循环,所以任何可以用循环解决的问题,也可以用尾递归解决:
@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
特别是,用尾递归表示迭代非常自然:
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
循环的语言是图灵完备的,因此尾递归至少可以用于计算自然数上的每个图灵可计算函数。
推荐阅读
- laravel - Laravel 无法写入 CentOs7 上的目录
- azure - 如何在 Azure 应用服务中使用 Datadog 代理?
- javascript - 为什么 Firebase 的“getRedirectResults()”返回“{user: null}”?
- ios - 'MyClass' 不可用:找不到此类的 Swift 声明 - 模拟器
- javascript - 获取主题功能以根据查看次数而不是日期对帖子进行排序
- python - 从 Pandas 引用 CSV
- google-apps-script - 无法获取活动用户的电子邮件
- flutter - 如何在 Flutter 中实现应用内购买订阅?
- http - 仅请求正文的 http/1.1 兼容方式
- php - MySQL 服务无法自动启动