【发布时间】:2017-03-19 10:11:27
【问题描述】:
我在尝试提出一种有效的方法来将 for - 表达式 N 皇后解决方案转换为尾递归形式并仍然保留使用 for 语法实现的惯用性质时遇到了一点问题。任何想法都非常受欢迎。
def place(boardSize: Int, n: Int): Solutions = n match {
case 0 => List(Nil)
case _ =>
for {
queens <- place(boardSize, n - 1)
y <- 1 to boardSize
queen = (n, y)
if (isSafe(queen, queens))
} yield queen :: queens
}
def isSafe(queen: Queen, others: List[Queen]) = {...}
【问题讨论】:
-
我认为像这样的回溯解决方案本质上是非尾递归的。除非您自己管理堆栈,否则代码显然会变得不那么优雅。
-
@Jasper-M 我同意管理堆栈是一项义务,如果我们要在没有外部可变
var的情况下进行尾递归。虽然它确实变得有点复杂,但也没有那么难看。
标签: scala tail-recursion for-comprehension