Scalaでお釣りの最適化

関数型ぽく書けるようになるにはひたすらコードを書き続けるしかないという事で
まずは手ごろそうなお釣りの最適化(最小枚数化)に挑んでみました。
varで剰余を管理しているのが残念な感じですね・・・。
他の人がどのように書いているかこちらを覗いたら全く違うやり方で
衝撃を受けた次第でアリマス。

object ChangeCalculator {

    val MoneyUnit = List(5000, 1000, 500, 100, 50, 10, 5, 1)
    
    class ChangeUnit(moneyUnit: Int, number: Int) {
        def getUnit = moneyUnit
        def getNumber = number
        def getString = {moneyUnit.toString+"円 "+
                         number.toString+"枚"}
    }
 
    def main(args: Array[String]) = {
        calChange(49)
        calChange(512)
        calChange(8917)
    }
     
    def calChange(change: Int): Unit = {
        println("[%d円]".format(change))
        getAssortmentOfChange(change).foreach(each =>
            if (each.getNumber > 0) println(each.getString))
        println("-------------------")
    }
    
    def getAssortmentOfChange(change: Int): List[ChangeUnit] = {
        var rest = change
     
        def getNumberByUnit(moneyUnit: Int): ChangeUnit = {
            val number = rest / moneyUnit
            rest = rest % moneyUnit
            new ChangeUnit(moneyUnit, number)
        }
        
        for (moneyUnit <- MoneyUnit)
            yield getNumberByUnit(moneyUnit)        
    }
}

結果はこのようになります。

[49円]
10円 4枚
5円 1枚
1円 4枚
-------------------
[512円]
500円 1枚
10円 1枚
1円 2枚
-------------------
[8917円]
5000円 1枚
1000円 3枚
500円 1枚
100円 4枚
10円 1枚
5円 1枚
1円 2枚
-------------------