Recursion
Exercise 1: Pascal’s Triangle
给出行数和列数,运用递归,画出帕斯卡三角形
def pascal(c: Int, r: Int): Int = {
if (c == 0 || r == c) 1
else pascal(c - 1, r - 1) + pascal(c, r - 1)
}
Exercise 2: Parentheses Balancing
给定一个字符数组,运用递归,判定它是否“括号平衡”
def balance(chars: List[Char]): Boolean = {
val counts = 0
def loop(acc: Int, temp: List[Char]): Boolean = {
if (acc < 0) false
else if (temp.isEmpty && acc==0) true
else if (temp.isEmpty && acc>0) false
else if (temp.head=='(') loop(acc+1, temp.tail)
else if (temp.head==')') loop(acc-1, temp.tail)
else loop(acc, temp.tail)
}
loop(counts, chars)
}
思路
我们从字符数组的第一个开始判定,如果是’(’,我们就对counts加1,如果是’)’,我们就对counts减1,递归过程中,一旦counts变为负,说明不平衡,如果最后递归完所有的字符,如果counts为0,说明平衡,如果counts为正,说明不平衡。
Exercise 3: Counting Change
给定钱的总值和硬币面额数,运用递归求出一共有多少种找零方法
def countChange(money: Int, coins: List[Int]): Int = {
if (coins.isEmpty || money<0) 0
else if (coins.tail.isEmpty && (money % coins.head==0)) 1
else countChange(money, coins.tail) + countChange(money-coins.head, coins)
}
}
思路
运用动态规划
假设k = Money/C1,那么Money可以按照下面的方式分解:
Money = E0 + C1 * 0
Money = E1 + C1 * 1
Money = E2 + C1 * 2
……
Money = Ek + C1 * k
其中E0……Ek由C2, C3……Cn线性组合。相当于构造Money的过程,分成用0,1,2,……k个C1这(k+1)种情况来考虑,所以可以得到下面的递推关系式。
countChange(money, coins)表示用coins种硬币,构造money的方案数,则:
countChange(money, coins) = countChange(money-C10, coins-1) + countChange(money-C11, coins-1) + …… + countChange(money-C1*k, coins-1)
上面递推关系式等价于:
countChange(money, coins) = countChange(money, coins-1) + countChange(money-C1, coins)