-
Guillaume Martres authoredGuillaume Martres authored
Assignment 1: Recursion
Setup
You can use the following commands to make a fresh clone of your repository:
git clone -b recfun git@gitlab.epfl.ch:lamp/student-repositories-f19/cs210-GASPAR.git cs210-recfun
cd cs210-recfun
You can always refer to:
- the example guide on the development workflow.
- this guide for details on the submission system. Make sure to submit your assignment before the deadline written in README.md
- The documentation of the Scala standard library
- The documentation of the Java standard library
Be functional!
This course is about functional programming, where you'll learn to program without using mutation, therefore you're not allowed to use the following constructs in the homeworks:
var
while
return
- Any class in the
scala.collection.mutable
package
Exercise 1: Pascal's Triangle
The following pattern of numbers is called Pascal's triangle.
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
...
The numbers at the edge of the triangle are all 1
, and each number
inside the triangle is the sum of the two numbers above it. Write a
function that computes the elements of Pascal's triangle by means of a
recursive process.
Do this exercise by implementing the pascal
function in
Main.scala
, which takes a column c
and a row r
, counting from
0
and returns the number at that spot in the triangle. For example,
pascal(0,2)=1
, pascal(1,2)=2
and pascal(1,3)=3
.
def pascal(c: Int, r: Int): Int
Exercise 2: Parentheses Balancing
Write a recursive function which verifies the balancing of parentheses
in a string, which we represent as a List[Char]
not a String
. For
example, the function should return true
for the following strings:
- (if (zero? x) max (/ 1 x))
- I told him (that it's not (yet) done). (But he wasn't listening)
The function should return false
for the following strings:
- :-)
- ())(
The last example shows that it's not enough to verify that a string contains the same number of opening and closing parentheses.
Do this exercise by implementing the balance
function in
Main.scala
. Its signature is as follows:
def balance(chars: List[Char]): Boolean
There are three methods on List[Char]
that are useful for this
exercise:
-
chars.isEmpty: Boolean
returns whether a list is empty -
chars.head: Char
returns the first element of the list -
chars.tail: List[Char]
returns the list without the first element
You can find more information on these methods in the documentation of List
Hint: you can define an inner function if you need to pass extra parameters to your function.
Testing: You can use the toList
method to convert from a
String
to a List[Char]
: e.g. "(just an) example".toList
.
Exercise 3: Counting Change
Write a recursive function that counts how many different ways you can make change for an amount, given a list of coin denominations. For example, there are 3 ways to give change for 4 if you have coins with denomiation 1 and 2: 1+1+1+1, 1+1+2, 2+2.
Do this exercise by implementing the countChange
function in
Main.scala
. This function takes an amount to change, and a list of
unique denominations for the coins. Its signature is as follows:
def countChange(money: Int, coins: List[Int]): Int
Once again, you can make use of functions isEmpty
, head
and tail
on the list of integers coins
.
Hint: Think of the degenerate cases. How many ways can you give change for 0 CHF? How many ways can you give change for >0 CHF, if you have no coins?