如何使用元组在Scala中递归迭代?

如何使用元组在Scala中递归迭代?,scala,recursion,tail-recursion,Scala,Recursion,Tail Recursion,我试图填充元组列表,但是列表中只添加了一个元素。我有两个功能def生成要添加到元组列表中的元组(由于我进行了测试,所以工作正常),以及def iterator生成要填充列表的元组 def mainFn(): List[(Int, Int, Set[Int])] = { def myList = List[(Int, Int, Set[Int])]() //t: tuple (r,c) def f(t:(Int,Int)): List[(Int, Int, Set[Int])] = {

我试图填充元组列表,但是列表中只添加了一个元素。我有两个功能
def
生成要添加到元组列表中的元组(由于我进行了测试,所以工作正常),以及
def iterator
生成要填充列表的元组

def mainFn(): List[(Int, Int, Set[Int])] = {
  def myList = List[(Int, Int, Set[Int])]()
  //t: tuple (r,c)
  def f(t:(Int,Int)): List[(Int, Int, Set[Int])] = {
    //if element is 0 add hypothesis otherwise move to next element
    if (sudoku.grid(t._1)(t._2) == 0){
      (t._1,t._2,hypothesis(t._1,t._2))::Nil
    }
    else Nil
  }

  def iterator(t:(Int,Int),li : List[(Int, Int, Set[Int])]): List[(Int, Int, Set[Int])] = {
    if (t==(0,0)) li ++ f(t)
    else if (t._2 < 9) li ++ f((t._1,t._2+1))//shifting to the element on the right
    else li ++ f((t._1+1, 0))//shifting to the next row
  }

  iterator((0,0),myList)
}
def mainFn():List[(Int,Int,Set[Int])]{
def myList=List[(Int,Int,Set[Int])]()
//t:元组(r,c)
定义f(t:(Int,Int)):列表[(Int,Int,Set[Int])]{
//如果元素为0,则添加假设,否则移动到下一个元素
if(数独网格(t._1)(t._2)=0){
(t
}
否则零
}
def迭代器(t:(Int,Int),li:List[(Int,Int,Set[Int])]:List[(Int,Int,Set[Int])]{
if(t==(0,0))li++f(t)
如果(t._2<9)li++f((t._1,t._2+1))//移到右边的元素
else li++f((t._1+1,0))//移到下一行
}
迭代器((0,0),myList)
}

我有一个形式为
List[List[Int]]
的数独网格,我想访问网格的每个单元格,如果元素为0,则生成一个形式为
(Int,Int,Set[Int])的元组。
否则移动到下一个单元格。然而,我不能使用任何循环结构,只允许递归调用。我不知道如何递归调用迭代器,使其在数独网格中循环

我最终使用了一种不同的方法(尽管仍然非常相似):

def allHypothesis(): List[(Int, Int, Set[Int])] = {
  def myList = List[(Int, Int, Set[Int])]()
  def f(t:(Int,Int), li: List[(Int, Int, Set[Int])]) : List[(Int, Int, Set[Int])] ={
    val (row, column) = t;
    if (row == 8 && column == 9) li
    else if (column == 9) f((row+1,0),li)
    else if (sudoku.grid(row)(column)==0) f((row,column+1), li:+(row,column,hypothesis(row, column)))
    else f((row,column+1),li)
  }
  f((0,0),myList)
}