如何将"while while"算法转换为功能样式?

sda*_*zig 4 algorithm functional-programming scala

在我的命令式Scala代码中,我有一个算法:

def myProcessor(val items: List) {
  var numProcessed = 0
  while(numProcessed < items.size) {
    val processedSoFar = items.size - numProcessed
    numProcessed += processNextBlockOfItems(items, processedSoFar)
  }
}
Run Code Online (Sandbox Code Playgroud)

我想保留"块处理"功能,而不只是在项目列表上执行"takeWhile".我怎样才能在功能风格中重写它?

whe*_*ies 5

您需要将其更改为递归样式,其中您在每个循环的"状态"中"通过"

@tailrec
def myProcessor(items: List[A], count: Int = 0): Int = items match{
  case Nil => count
  case x :: xs => 
    processNextBlockOfItems(items, count) 
    myProcessor(xs, count + 1)
}
Run Code Online (Sandbox Code Playgroud)

假设"processedSoFar"不是索引.如果您可以使用列表的当前"头部":

@tailrec
def myProcessor(items: List[A], count: Int = 0): Int = items match{
  case Nil => count
  case x :: xs => 
    process(x) 
    myProcessor(xs, count + 1)
}
Run Code Online (Sandbox Code Playgroud)

哪里process只处理当前的"头" List.