Looking at the resources that the scala course from coursera offers I found an algorithm which should work ( the logic should work ) however when implemented in scala it returns a stack-overflow. I think I know what a stack is as I have played in C for a bit but I don't understand how the following function can use up so much memory:
def countChange(money: Int, coins: List[Int]): Int = {
def cc(amount: Int, list: List[Int]): Int = {
if (amount == 0) 1
if (amount < 0 || list.isEmpty) 0
return cc(amount - list.head, list) + cc(amount, list.tail)
}
cc(money, coins)
}
Here is the error:
Exception in thread "main" java.lang.StackOverflowError
at java.lang.Integer.valueOf(Unknown Source)
at scala.runtime.BoxesRunTime.boxToInteger(BoxesRunTime.java:70)
at recfun.Main$.cc$1(Main.scala:78)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
at recfun.Main$.cc$1(Main.scala:80)
Here is the call to the function:
println ("" + countChange(10,List(2,3,5)))