我在使用循环的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
可以替代吗?先感谢您。
答案 0 :(得分:1)
考虑一下递归调用subtractCoin()
后会发生什么。您的for
理解(正确的术语)没有yield
子句,因此语句的计算结果为Unit
,这不是subtractCoin()
应该返回的内容。因此错误。
使用wallet
并与wallet.head
递归可能会更好,而不是推进wallet.tail
的索引。 (索引List
效率不高。)
此外,递归的第一条规则是什么? ---&GT; 测试终点条件!