scala 第一周编程作业

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)


你可能感兴趣的:(scala)