14. Scala使用递归的方式去思考,去编程
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使用递归的方式去思考,去编程的更多相关文章
- MySQL 8.0.14 新的密码认证方式和客户端链接
MySQL 8.0.14 新的密码认证方式和客户端链接 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. MySQL8.0在密码认证方式发生了改变,这也是有点小伙伴在MySQL创建 ...
- Java非递归的方式获取目录中所有文件(包括目录)
零.思路解析 对于给出的文件查看其下面的所有目录,将这个目录下的所有目录放入待遍历的目录集合中,每次取出该集合中的目录遍历,如果是目录再次放入该目录中进行遍历. 一.代码 /** * 非递归的方式获取 ...
- [Effective Python] 用Pythonic方式来思考
Effective Python chap.1 用Pythonic方式来思考 Pythonic: 一门语言的编程习惯是由用户来确立的. 1. 确认自己所使用的Python版本 2. 遵循PEP8风格指 ...
- 【Python】利用递归函数调用方式,将所输入的字符串,以相反的顺序显示出来
源代码: """ 利用递归函数调用方式,将所输入的字符串,以相反的顺序显示出来 string_reverse_output():反向输出字符串的自定义函数 pending ...
- day03 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数
本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 温故知新 1. 集合 主要作用: 去重 关系测 ...
- Tomcat 7 的七大新特性(更容易将Tomcat内嵌到应用去中去 )
Tomcat的7引入了许多新功能,并对现有功能进行了增强.很多文章列出了Tomcat 7的新功能,但大多数并没有详细解释它们,或指出它们的不足,或提供代码示例.本文将明确描述TOMCAT 7中七个最显 ...
- 使用spring方式来实现aop编程
1:什么是aop? Aspect Oriented Programming 面向切面编程 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译 ...
- Scala进阶之路-idea下进行spark编程
Scala进阶之路-idea下进行spark编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 1>.创建新模块并添加maven依赖 <?xml version=&qu ...
- React.js入门笔记(续):用React的方式来思考
本文主要内容来自React官方文档中的"Thinking React"部分,总结算是又一篇笔记.主要介绍使用React开发组件的官方思路.代码内容经笔者改写为较熟悉的ES5语法. ...
随机推荐
- asp.net+jquery 制作text editor
利用jquery制作的文本编辑器,直接给源码吧,相信大家都能看懂.点此下载
- Qt Creator清除最近工程历史信息
Qt Creator清除最近工程历史信息 随着不断打开和关闭qt工程,欢迎->Projects->Recent projects下的历史工程信息越来越多,是该清理一下了,强迫症会追求干净一 ...
- 【转】解决Oracle 11g在用EXP导出时,空表不能导出
一.问题原因: 11G中有个新特性,当表无数据时,不分配segment,以节省空间 .insert一行,再rollback就产生segment了. 该方法是在在空表中插入数据,再删除,则产生segme ...
- 0x03 Python logging模块之Formatter格式
目录 logging模块之Formatter格式 Formater对象 日志输出格式化字符串 LogRecoder对象 时间格式化字符串 logging模块之Formatter格式 在记录日志是,日志 ...
- POJ 3155Hard Life(最大密度子图)
论文出处:最小割模型在信息学竞赛终的应用 #include <iostream> #include <cstdio> #include <cstring> #inc ...
- js 驼峰命名和下划线互换
代码走你 // 下划线转换驼峰 function toHump(name) { return name.replace(/\_(\w)/g, function(all, letter){ return ...
- Win10开启快速启动后关机变重启
同样可以用来解决,“msconfig引导为空”,“默认操作系统为空”,“win10改为uefi启动后关机变重启”,“legacy转uefi后无法关机” 问题起因 换完主板和cpu后,新的主板在开机时总 ...
- 2019 Nowcoder Multi-University Training Contest 4 E Explorer
线段树分治. 把size看成时间,相当于时间 $l$ 加入这条边,时间 $r+1$ 删除这条边. 注意把左右端点的关系. #include <bits/stdc++.h> ; int X[ ...
- 推荐:Markdown编辑软件 --- 小书匠
推荐:Markdown编辑软件 --- 小书匠 小书匠 使用手册 Markdown编辑工具推荐小书匠工具,功能丰富,简单使用,可以一步导文件至博客园主页. 概要 小书匠编辑器是一款专为markdown ...
- kubernetes node节点失效 调度
kubernetes 配置: 测试node挂 机,发布需要等几分才会 在其它 的node机器 启动,这个明显不合理,对于大多数业务 kube-controller-manager配置: /etc/sy ...