List 在Scala中对屈服结构的递归调用
我对Coursera的以下Scala代码感到困惑。该代码的目的是在胸前板上放置n个皇后,这样皇后就不会受到彼此的威胁,这意味着相同的行、列或对角线List 在Scala中对屈服结构的递归调用,list,scala,recursion,set,List,Scala,Recursion,Set,我对Coursera的以下Scala代码感到困惑。该代码的目的是在胸前板上放置n个皇后,这样皇后就不会受到彼此的威胁,这意味着相同的行、列或对角线 从k=0到k=n,递归调用的求值如何在每个步骤中工作?是否有递归调用PlaceQueen(k-1)发生在行yield col::queens中 如果col::queens将前面行的列作为列表追加,则yield col::queens的输出应为列列表。但它是如何转化为一组列表的呢 object nQueens extends App{
PlaceQueen(k-1)
发生在行yield col::queens
中
col::queens
将前面行的列作为列表追加,则yield col::queens
的输出应为列列表。但它是如何转化为一组列表的呢
object nQueens extends App{
def queens(n: Int): Set[List[Int]] = {
def placeQueens(k: Int): Set[List[Int]] =
if (k == 0) Set(List())
else
for {
queens <- placeQueens(k - 1)
col <- 0 until n
if isSafe(col, queens)
} yield col :: queens
placeQueens(n)
}
def isSafe(col: Int, queens: List[Int]): Boolean = {
val row = queens.length
val queensWithRows = (row - 1 to 0 by -1) zip queens
queensWithRows forall {
case (c, r) => col != c && math.abs(col - c) != row - r
}
}
queens(4)
}
对象队列扩展应用程序{
def queens(n:Int):设置[List[Int]={
def placeQueens(k:Int):Set[List[Int]]=
如果(k==0)设置(List())
其他的
为了{
queens忽略代码中的所有问题,这些问题使其无法实现预期目标,您的问题的答案如下:
如何将其转换为一组列表
object nQueens extends App{
def queens(n: Int): Set[List[Int]] = {
def placeQueens(k: Int): Set[List[Int]] =
if (k == 0) Set(List())
else
for {
queens <- placeQueens(k - 1)
col <- 0 until n
if isSafe(col, queens)
} yield col :: queens
placeQueens(n)
}
def isSafe(col: Int, queens: List[Int]): Boolean = {
val row = queens.length
val queensWithRows = (row - 1 to 0 by -1) zip queens
queensWithRows forall {
case (c, r) => col != c && math.abs(col - c) != row - r
}
}
queens(4)
}
它被转换是因为
的中的第一个集合是Set
。之所以设置它是因为Set
被定义为placeQueens
的返回类型
queens此代码有多个无限循环
queens
方法本身调用simple,这显然是不正确的:
def queens(n:Int):Set[List[Int]] = {
def placeQueens(k:Int):Set[List[Int]] = ???
def isSafe(col: Int, queens:List[Int]):Boolean = ???
queens(4)
}
placeQueens
方法在经过一点计算后也会调用自己:
def placeQueens(k:Int):Set[List[Int]] = {
if (k==0) Set(List())
else
for {
queens <-placeQueens(k-1)
col <- 0 until n
if isSafe(col,queens)
} yield col:: queens
placeQueens(n)
}
def placeQueens(k:Int):设置[List[Int]={
如果(k==0)设置(List())
其他的
为了{
queens如果你能发布编译过的代码,这会有所帮助。我已经修复了一些明显的错误,但仍然不正确或不完整。