diff --git a/a1-recfun/src/main/scala/recfun/Main.scala b/a1-recfun/src/main/scala/recfun/Main.scala index 277aa1a..e7ac8ca 100644 --- a/a1-recfun/src/main/scala/recfun/Main.scala +++ b/a1-recfun/src/main/scala/recfun/Main.scala @@ -14,15 +14,35 @@ object Main { /** * Exercise 1 */ - def pascal(c: Int, r: Int): Int = ??? + def pascal(column: Int, row: Int): Int = (column, row) match { + case (c, r) if r < c => throw new IllegalArgumentException("must be: r >= c") + case (c, r) if (column == 0 || column == row) => 1 + case _ => pascal(column, row - 1) + pascal(column - 1, row - 1) + } /** * Exercise 2 */ - def balance(chars: List[Char]): Boolean = ??? + def balance(chars: List[Char]): Boolean = { + def parenthesesCounter(cs: List[Char], leftParenthesesCount: Int): Boolean = + if (leftParenthesesCount < 0) false + else cs match { + case Nil => leftParenthesesCount == 0 + case ')' :: xs => parenthesesCounter(xs, leftParenthesesCount - 1) + case '(' :: xs => parenthesesCounter(xs, leftParenthesesCount + 1) + case x :: xs => parenthesesCounter(xs, leftParenthesesCount) + } + parenthesesCounter(chars, 0) + } /** * Exercise 3 */ - def countChange(money: Int, coins: List[Int]): Int = ??? -} + def countChange(money: Int, coins: List[Int]): Int = { + def countChangeWays(money: Int, coins: List[Int]): Int = + if (money == 0) 1 + else if (coins.isEmpty || money < 0) 0 + else countChangeWays(money, coins.tail) + countChangeWays(money - coins.head, coins) + countChangeWays(money, coins.sorted) + } +} \ No newline at end of file diff --git a/a1-recfun/src/test/scala/recfun/BalanceSuite.scala b/a1-recfun/src/test/scala/recfun/BalanceSuite.scala index c040682..ee15d01 100644 --- a/a1-recfun/src/test/scala/recfun/BalanceSuite.scala +++ b/a1-recfun/src/test/scala/recfun/BalanceSuite.scala @@ -24,4 +24,4 @@ class BalanceSuite extends FunSuite { test("balance: counting is not enough") { assert(!balance("())(".toList)) } -} +} \ No newline at end of file diff --git a/a1-recfun/src/test/scala/recfun/CountChangeSuite.scala b/a1-recfun/src/test/scala/recfun/CountChangeSuite.scala index 0da3359..15a7f47 100644 --- a/a1-recfun/src/test/scala/recfun/CountChangeSuite.scala +++ b/a1-recfun/src/test/scala/recfun/CountChangeSuite.scala @@ -9,18 +9,18 @@ import org.scalatest.junit.JUnitRunner class CountChangeSuite extends FunSuite { import Main.countChange test("countChange: example given in instructions") { - assert(countChange(4,List(1,2)) === 3) + assert(countChange(4, List(1, 2)) === 3) } test("countChange: sorted CHF") { - assert(countChange(300,List(5,10,20,50,100,200,500)) === 1022) + assert(countChange(300, List(5, 10, 20, 50, 100, 200, 500)) === 1022) } test("countChange: no pennies") { - assert(countChange(301,List(5,10,20,50,100,200,500)) === 0) + assert(countChange(301, List(5, 10, 20, 50, 100, 200, 500)) === 0) } test("countChange: unsorted CHF") { - assert(countChange(300,List(500,5,50,100,20,200,10)) === 1022) + assert(countChange(300, List(500, 5, 50, 100, 20, 200, 10)) === 1022) } -} +} \ No newline at end of file diff --git a/a1-recfun/src/test/scala/recfun/PascalSuite.scala b/a1-recfun/src/test/scala/recfun/PascalSuite.scala index 58c899e..a950c5b 100644 --- a/a1-recfun/src/test/scala/recfun/PascalSuite.scala +++ b/a1-recfun/src/test/scala/recfun/PascalSuite.scala @@ -9,14 +9,20 @@ import org.scalatest.junit.JUnitRunner class PascalSuite extends FunSuite { import Main.pascal test("pascal: col=0,row=2") { - assert(pascal(0,2) === 1) + assert(pascal(0, 2) === 1) } test("pascal: col=1,row=2") { - assert(pascal(1,2) === 2) + assert(pascal(1, 2) === 2) } test("pascal: col=1,row=3") { - assert(pascal(1,3) === 3) + assert(pascal(1, 3) === 3) + } + + test("pascal: row < col") { + intercept[IllegalArgumentException] { + pascal(3, 1) + } } }