这段代码可能很长很难看,有没有办法让我用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()
}
}
答案 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)