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 标准库或者 Scalaz 中的既有功能。所以,当你读完本书,做完习题后,虽然你的应用开发能力并不会直接提升,但你会体会到构建函数式语言和框架时的难点和取舍,从而增进你的框架开发和语言设计的能力。   ——ThoughtWorks Lead Consultant 杨博   这本书所讲授的,正是基于 Scala 的函数式编程基础。基于 Scheme、Haskell 等老牌函数式语言的传统教材的问题在于,相关语言的语法和思维方式与读者现有的知识体系迥异,容易造成较为陡峭的入门门槛。此外,由于这些语言本身的实际应用机会不多,初学者也难以在实战中获得宝贵的直觉和经验。而在 Scala 的帮助下,这本书并不要求你抛开现有的思维方式另起炉灶,它所做的更像是为你现有的思维方式添砖加瓦,从而令你如虎添翼。   ——Spark committer from Databricks 连城   尽管函数式编程在近十多年用得越来越多,但市面上介绍其高阶特性的书却并不多。这本书在这方面是个重要的补充,它不仅仅面向 Scala 程序员,同样面向用任何编程语言开发的程序员,只要你充满好奇心。   ——挖财网首席架构师 王宏江   “让你洞察计算的本质。”   ——Martin Odersky, Scala的作者   “Scala和Java8开发者的函数式编程指南!”   ——William E. Wheeler, TekSystems   “本书向你展示了提升Scala技能的方法和理念,它已超过‘更好的Java’。”   ——Fernando Dobladez, Code54   “里面的练习有些挑战,很有趣,对你在真实世界中使用它很有益。”   ——Chris Nauroth, Hortonworks   “边干边学,而非只是阅读。”   ——Douglas Alan、Eli和Edythe L. Broad,哈佛和麻省理工学院
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值