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. Excel分列,Excel 列拆分,Excel根据分隔符号拆分某列

    解决方案: https://zhidao.baidu.com/question/572807483.html 步骤:数据--分列--下一步--其它---下一步-- 注意的此操作会覆盖当前列和后n列(根 ...

  2. stdin,stdout 和 STDOUT_FILENO,STDIN_FILENO

    stdin,stdout 等类型为 FILE *. STDIN_FILENO,STDOUT_FILENO,STDERR_FILENO 等类型为 int. 使用 FILE * 的函数主要有:fopen. ...

  3. 利用 FluentScheduler 启动定时器计划任务

    FluentScheduler 是什么? Automated job scheduler with fluent interface. 这是作者在 Github 上的介绍,就是一个定时任务管理器.在 ...

  4. 【JavaScript】内部与外部引入方式

    1.内部引入方式: script的type属性默认为"text/javascript",可以不写 <script type="text/javascript&quo ...

  5. 性能测试基础---jmeter webservice接口测试

    ·webservice接口测试实现.·SOA:面向服务的体系架构,主要为了应对大型系统的异构需求.典型的实现方式:webservice·微服务:为了对SOA这样的重服务架构进行解耦而存在的.一个or几 ...

  6. 数据结构 - 链栈的实现 C++

    链栈封装 C++ 使用C++对链栈进行了简单的封装,实现了栈的基本操作 封装方法: pop(),top(),size(),empty(),push() 代码已经过测试 #pragma once #in ...

  7. RF元素定位的例子

    Execute Javascript $("input[type='button']").click() Comment Click Button css=input.login_ ...

  8. apt-get update失败处理:*** Error in `appstreamcli': double free or corruption (fasttop): 0x00000000015c4bf0 ***

    好像只要卸载一个东西就可以了(至少我的是这样): sudo apt-get purge libappstream3 再重新执行update命令, sudo apt-get update 参考链接: 1 ...

  9. Anaconda3(2)Anaconda3中安装TensorFlow

    https://zhuanlan.zhihu.com/p/34730661 1. 安装anaconda3:自行下载.安装[注意版本] (可参考引用链接) 2. 搭建TensorFlow环境 cuda1 ...

  10. innerHTML, innerText, outerHTML, outerText的区别

    innerHTML:返回标签内部嵌套的子元素的所有html标签+文本内容content. innerText:返回标签内部嵌套的子元素的文本内容content. outerHTML:返回标签本身+嵌套 ...