2017-07-25 5 views
0

ループを使用するスカラーで再帰関数を定義する際に問題が発生しています。この関数は、ある範囲のコイン貨幣(ウォレット)を通過しなければならず、特定の条件が満たされた場合、リストのリストを返します。そうでなければ、それ自身を再び呼び出す。スカラーでは、再帰関数内でループを使用できますか?

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) 
    } 
} 

Iました次のコンパイルエラー:ここで私が書いたコードがある

error: type mismatch; 
found : Unit 
required: List[List[Int]] 
     for (i <- 0 to wallet.length) { 
      ^
なぜそれがループ上の結果の型を課している

?ループを使用する方法はありますか? foreachは代わりになりますか?前もって感謝します。

+0

rangeOfCoins.length == 0の場合はどうなりますか?リスト[リスト[Int]]を返しますか? – dave

+0

こんにちはデイブ、申し訳ありませんが、私の悪い、エラーメッセージのrangeOfCoinsはウォレットに対応しています(修正済みです)。この条件は、関数を呼び出す前にコード内でフィルタリングされます。 – Sandra

答えて

1

subtractCoin()への再帰呼び出しの後に何が起こるかを考えてください。あなたのforの理解度(適切な用語)にはyield句がないので、文はUnitと評価されます。これはsubtractCoin()が返すものではありません。したがって、エラー。

walletのインデックスを進めるのではなく、wallet.headで作業し、wallet.tailと再帰するのがおそらくよいでしょう。 (Listのインデックス作成は効率的ではありません)

また、再帰の最初のルールは何ですか? --->ターミナル条件のテスト!

関連する問題