14.1 基本介绍

      -Scala饰运行在Java虚拟机(Java Virtual Machine)之上,因此具有如下特点

        1) 轻松实现和丰富的Java类库互联互通

        2) 它既支持面向对象的编程方式,又支持函数式编程

        3) 它写出的程序像动态语言一样简洁,但事实上它确是严格意义上的静态语言

14.2 Scala提倡函数式编程(递归思想)

      -先说下编程范式:

        1) 在所有的编程范式中,面向对象编程(Object-Oriented Programming)无意是最大赢家

        2) 但其实面向对象编程并不是一种严格意义上的编程范式,严格意义上的编程范式分为:命令式编程(Imperative Programming)、函数式编程(Functional Programming)和逻辑式编程(Logic Programming)。面向对象编程只是上述几种范式的一个交叉产物,更多的还是继承了命令式编程的基因

        3) 在传统的语言设计中,只有命令式编程得到了强调,那就是程序员要告诉计算机应该怎么做。而递归则是通过灵巧的函数定义,告诉计算机做什么。因此在使用命令式编程思维的程序中,是现在多数程序采用的编程方式,递归出镜的几率很少,而在函数式编程中,可以随处见到递归的方式

14.3 应用案例1

      -Scala中循环不建议使用while和do...while,而建议使用递归

  14.3.1 案例要求

      -计算1-100的和

  14.3.2 常规的解决方式

import java.text.SimpleDateFormat
import java.util.Date object boke_demo01 {
def main(args: Array[String]): Unit = { //传统方法完成 1-100 的求和任务
val now: Date = new Date()
val dateFormat: SimpleDateFormat =
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
val date = dateFormat.format(now) println("date=" + date) //输出时间
var res = BigInt(0)
var num = BigInt(1)
var maxVal = BigInt(100l) //BigInt(99999999l)[测试效率大数]
while (num <= maxVal) {
res += num
num += 1
}
println("res=" + res)
//再一次输出时间
val now2: Date = new Date()
val date2 = dateFormat.format(now2)
println("date2=" + date2) //输出时间 }
}

  14.3.3 使用函数式编程方式-递归

      函数式编程的重要思想就是尽量不要产生额外的影响,上面的案例代码就不符合函数式编程的思想,下面使用函数式编程方式来解决(Scala提倡的方式)

      -案例演示

import java.text.SimpleDateFormat
import java.util.Date object boke_demo01 {
def main(args: Array[String]): Unit = { // 递归的方式来解决
//传统方法完成 1-100 的求和任务
val now: Date = new Date()
val dateFormat: SimpleDateFormat =
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
val date = dateFormat.format(now)
println("date=" + date) //输出时间 def mx(num: BigInt, sum: BigInt): BigInt = {
if (num <= 100l) return mx(num + 1, sum + num)
else return sum
} //测试
var num = BigInt(1)
var sum = BigInt(0)
var res = mx(num, sum)
println("res=" + res) //再一次输出时间
val now2: Date = new Date()
val date2 = dateFormat.format(now2)
println("date2=" + date2) //输出时间 }
}

14.4 应用案例2

      -求最大值

  def max(xs: List[Int]): Int = {
if (xs.isEmpty)
throw new java.util.NoSuchElementException
if (xs.size == 1) xs.head
else if (xs.head > max(xs.tail)) xs.head else max(xs.tail)
}

14.5 使用函数式编程方式-字符串翻转

def reverse(xs: String): String =
if (xs.length == 1) xs else reverse(xs.tail) + xs.head

14.6 使用递归-求阶乘

def factorial(n: Int): Int =
if (n == 0) 1 else n * factorial(n - 1)

14. Scala使用递归的方式去思考,去编程的更多相关文章

  1. MySQL 8.0.14 新的密码认证方式和客户端链接

    MySQL 8.0.14 新的密码认证方式和客户端链接 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   MySQL8.0在密码认证方式发生了改变,这也是有点小伙伴在MySQL创建 ...

  2. Java非递归的方式获取目录中所有文件(包括目录)

    零.思路解析 对于给出的文件查看其下面的所有目录,将这个目录下的所有目录放入待遍历的目录集合中,每次取出该集合中的目录遍历,如果是目录再次放入该目录中进行遍历. 一.代码 /** * 非递归的方式获取 ...

  3. [Effective Python] 用Pythonic方式来思考

    Effective Python chap.1 用Pythonic方式来思考 Pythonic: 一门语言的编程习惯是由用户来确立的. 1. 确认自己所使用的Python版本 2. 遵循PEP8风格指 ...

  4. 【Python】利用递归函数调用方式,将所输入的字符串,以相反的顺序显示出来

    源代码: """ 利用递归函数调用方式,将所输入的字符串,以相反的顺序显示出来 string_reverse_output():反向输出字符串的自定义函数 pending ...

  5. day03 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数

    本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 温故知新 1. 集合 主要作用: 去重 关系测 ...

  6. Tomcat 7 的七大新特性(更容易将Tomcat内嵌到应用去中去 )

    Tomcat的7引入了许多新功能,并对现有功能进行了增强.很多文章列出了Tomcat 7的新功能,但大多数并没有详细解释它们,或指出它们的不足,或提供代码示例.本文将明确描述TOMCAT 7中七个最显 ...

  7. 使用spring方式来实现aop编程

    1:什么是aop? Aspect Oriented Programming 面向切面编程 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译 ...

  8. Scala进阶之路-idea下进行spark编程

    Scala进阶之路-idea下进行spark编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 1>.创建新模块并添加maven依赖 <?xml version=&qu ...

  9. React.js入门笔记(续):用React的方式来思考

    本文主要内容来自React官方文档中的"Thinking React"部分,总结算是又一篇笔记.主要介绍使用React开发组件的官方思路.代码内容经笔者改写为较熟悉的ES5语法. ...

随机推荐

  1. Object-C学习之NSSet和NSMutableSet

    转自:http://blog.csdn.net/likandmydeer/article/details/7939749 一.简介 集合(set)是一组单值对象,它可以是固定的(NSSet).也可以是 ...

  2. c#导出数据到csv文本文档中,数据前面的0不见了解决方法

    ((char)(9)).ToString() + dataRow["FUserName"].ToString().Trim() + "\t",

  3. flink dataset join笔记

    1.dataset的join连接,通过key进行关联,一般情况下的join都是inner join,类似sql里的inner join key包括以下几种情况: a key expression a ...

  4. OPATCH在线补丁

    如果补丁中有online目录就是在线补丁,不需要数据库停机,在线的又分集群和非集群,如下 查看readme可以得知在线补丁打法 $ cat README.txt Oracle Database 11g ...

  5. IDEA 设置(中文乱码、svn、热部署、ideolog 、Jrebel )

    目录 console中文乱码 idea 多个工程分别设置svn idea svn忽略版本控制 idea svn客户端 ideolog 插件配置 idea 热部署 Jrebel 插件激活和使用 # I ...

  6. rhel7 学习第三天

    <Linux就该这么学>学习第三天,掌握了一些常用的命令

  7. python基本数据类型的时间复杂度

    1.list 内部实现是数组 2.dict 内部实现是hash函数+哈希桶.一个好的hash函数使到哈希桶中的值只有一个,若多个key hash到了同一个哈希桶中,称之为哈希冲突. 3.set 内部实 ...

  8. 解决samba共享虚拟机第二块磁盘的难题

    linux下使用samba共享文件到window下已经实现过了   点此链接 但是共享时磁盘空间是有限的,如果空间使用完了该怎么处理呢?这是个头疼的问题,不知道samba支持不支持共享第二个文件夹,由 ...

  9. Ingress对外暴露端口

    http,https端口 apiVersion: extensions/v1beta1 kind: Ingress metadata: name: kubernetes-dashboard names ...

  10. C++中typedef和define的区别

    typedef和#define的用法与区别 一.typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像: ...