List 在Scala中对屈服结构的递归调用

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{

我对Coursera的以下Scala代码感到困惑。该代码的目的是在胸前板上放置n个皇后,这样皇后就不会受到彼此的威胁,这意味着相同的行、列或对角线

  • 从k=0到k=n,递归调用的求值如何在每个步骤中工作?是否有递归调用
    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如果你能发布编译过的代码,这会有所帮助。我已经修复了一些明显的错误,但仍然不正确或不完整。