scala 第一周编程作业

本文介绍并实现三种递归算法:绘制帕斯卡三角形、判断括号序列是否平衡及计算找零方法的数量。通过具体实例解析递归思路,帮助读者理解递归原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值