在scala中,我们可以在递归函数中使用循环吗?

时间:2017-07-25 17:44:41

标签: scala loops recursion

我在使用循环的scala中定义递归函数时遇到了麻烦。该功能应该通过一系列硬币面额(钱包),如果满足某个条件,它将返回一个列表列表;如果没有,它会再次召唤自己。这是我写的代码:

def subtractCoin(money: Int, wallet: List[Int], coins: List[Int], coinsSet: List[List[Int]]): List[List[Int]] = {

  for (i <- 0 to wallet.length) {
    if (money - wallet(i) < 0) {
      if (money - coins.reduce(_ + _) == 0) (coinsSet :+ coins.sortWith(_ > _)) else coinsSet
    }
    else subtractCoin(money - wallet(i), wallet, coins :+ wallet(i), coinsSet)
  }
}

我收到了以下编译错误:

 error: type mismatch;
 found   : Unit
 required: List[List[Int]]
        for (i <- 0 to wallet.length) {
               ^

为什么在循环中强加结果类型?有没有办法使用循环? foreach可以替代吗?先感谢您。

1 个答案:

答案 0 :(得分:1)

考虑一下递归调用subtractCoin()后会发生什么。您的for理解(正确的术语)没有yield子句,因此语句的计算结果为Unit,这不是subtractCoin()应该返回的内容。因此错误。

使用wallet并与wallet.head递归可能会更好,而不是推进wallet.tail的索引。 (索引List效率不高。)

此外,递归的第一条规则是什么? ---&GT; 测试终点条件!