我可以使用while循环来缩短此Scala代码

时间:2015-03-04 15:58:28

标签: scala loops while-loop

这段代码可能很长很难看,有没有办法让我用while循环或其他任何东西缩短它?我是scala编程的新手

object VendingMachine {

/** You need to write a program to calculate the coins that a vending  
 *  machine should dispense as change in an 8 element array (one array
 *  element for each denomination of coin)
 *
 * For example:
 *      giveTheChange(242) gives Array(1,0,0,2,0,0,1,0)
 *      
 * As 242p = (1*£2)+(0*£1)+(0*50p)+(2*20p)+(0*10p)+(0*5p)+(1*2p)+(0*1p) 
 */
def giveTheChange(money : Int) : Array[Int] = {
    // TODO: Complete this method.
    // Write your solution here


    var change:Array[Int] = new Array[Int](8)
    var changegiven = money
    count = 0

    if(changegiven >= 200){
    count = changegiven / 200
    change(0) = count
    changegiven = changegive%200
    }

    return change()
}
}

1 个答案:

答案 0 :(得分:1)

你走了。故意没有解释实际代码,你是在回答作业之后。但是一些一般的提示 - 如果你发现自己重复的代码与操作的数据相同,那么,是的,一个while循环可能是一种可能性,但是像Scala这样的语言具有丰富的函数编程功能和广泛的集合图书馆,还有其他选择。

您希望迭代各种硬币大小。您可以使用数组执行此操作,并在该数组上执行循环。我有一个经验法则,如果我只使用一个索引来检索数组的当前元素(也就是说,索引的值在任何其他方面都不重要)那么可能有更优雅的方法它

在Scala中,我们有很多方法可以迭代集合。 foldLeft是暗示性的,因为它允许我们迭代一个数组,收集我们去的东西,在这里我们想收集要使用的硬币。

另一个观点:一旦我处理了最大的硬币,我就剩下一些较小的钱,以及一小套硬币。所以我有一个小问题。最终,我没有钱,没有钱,也没有更多的事可做。这种分而治之的方法提出了一种递归解决方案。

def giveTheChange(money:Int): Array[Int] = {
val coins = List(200,100,50,20,10,5,2,1)

  coins.foldLeft((List[Int](), money))
                { case ((change, amount), coin) => 
                     ((amount / coin) :: change, amount % coin) }
  ._1
  .reverse
  .toArray
}
giveTheChange(242)
//> res0: Array[Int] = Array(1, 0, 0, 2, 0, 0, 1, 0)

和另一种方法

  def giveTheChange2(money:Int): Array[Int] = {
    def gtChelper(coins:List[Int], money:Int):List[Int] = coins match {
    case Nil => Nil
    case c::t =>  (money / c) :: gtChelper(t, money % c)
    }
   val coins = List(200,100,50,20,10,5,2,1)
   gtChelper(coins, money).toArray
   }
   giveTheChange2(242) 
   //> res1: Array[Int] = Array(1, 0, 0, 2, 0, 0, 1, 0)