传统方式和递归方式速度 PK | 学习笔记

简介: 快速学习传统方式和递归方式速度 PK

开发者学堂课程【Scala 核心编程 - 进阶传统方式和递归方式速度 PK学习笔记,与课程紧密连接,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/610/detail/9098


传统方式和递归方式速度 PK


内容介绍:

一、应用案例

二、使用函数式编程方式-递归

三、总结


一、应用实例

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

应用实例要求:

计算1-50的和

常规的解决方式

用 while 循环

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 = Biglnt(O)

var num = Biglnt(1)

var maxVal = Biglnt(99999999I)//BigInt(99999999I)[测试效率大数]

while (num= maxVal){

res += num

num += 1

}

println("res=" + res)

实操1:

//计算1-50的和,使用常规的while来完成

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) // num变化的数

var maxval = BigInt(99999999l)//BigInt(99999999L)[测试效率大数]//使用传统的while

while (num <= maxval) {res += num//累计

num += 1//变量的叠加

}

println( "res=" + res)//结果,耗时8秒

继续输出时间

val now2 : Date = new Date()

val date2 = dateFormat.format(now2)

println("执行完毕的时间date2” + date)//输出时间

//递归的方式来统计1+....+num和

def mx(num: BigInt, sum: BigInt):BigInt = {

if(num <= 999999991)return mx (num+1, sum +num)else return sum

}

接收一个 num ,传进一个 sum ,未使用外部变量,保证函数的纯洁性,如果num 小于999999991,递归调用,调用 max ,num + 1,sum 累计一个,一直到 num 不在小于999999991,整个结果返回

实操2:

//执行前的时间,8秒

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 num = Bigint(1)// num

var sum = BigInt(0) //累计和

var res = mx(num, sum) //调用

println( "res是=” + res) //输出结果

//执行后的时间,8秒

val now2 : Date = new Date()

val date2 = dateFormat.format(now2)

println("执行完毕的时间date2” + date)//输出时间

递归小心使用,如果使用不当,会出现问题,递归对速度影响不大


二、使用函数式编程方式-递归

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

测试:看看递归的速度是否有影响?

不大

递归使用的陷阱

//递归的方式来解决

def mx(num:Biglnt,sum:Biglnt):Biglnt = {

if(num <= 99999999l) return mx(num+1,sum + num)else return sum

}

//测试

var num = Biglnt(1)var sum= Biglnt(O)

var res = mx(num,sum)println("res=" +res)


三、总结

1.递归的基本介绍,Scala 语言的特色,简洁高效。

2.递归思想书写代码,介绍编程范式及其特点,面向对象。递归出镜几率小,原因递归难理解,使用不好容易出问题。

3.应用实例,求和问题,使用常规和递归的方式解决。常规共耗时8秒钟,递归方式耗时8秒,影响效率不大,但是递归存在使用陷阱。

相关文章
|
5月前
|
SQL 索引
业务系统架构实践问题之想要再SQL代码中生成递增序列,那么步骤问题如何解决
业务系统架构实践问题之想要再SQL代码中生成递增序列,那么步骤问题如何解决
|
6月前
|
存储 算法
数据结构和算法——散列表的性能分析(开放地址法的查找性能、期望探测次数与装填因子的关系、分离链接法的查找性能)
数据结构和算法——散列表的性能分析(开放地址法的查找性能、期望探测次数与装填因子的关系、分离链接法的查找性能)
136 0
|
存储 算法 NoSQL
​浅谈分布式唯一Id生成器之最佳实践
​浅谈分布式唯一Id生成器之最佳实践
329 1
随机ID生成的几种 方式整理(现阶段基础)
随机ID生成的几种 方式整理(现阶段基础)
379 1
|
存储 缓存 前端开发
伙伴匹配推荐接口的优化策略【优先队列+多线程分批处理,java实现】
伙伴匹配推荐接口的优化策略【优先队列+多线程分批处理,java实现】
176 0
|
人工智能 算法 Java
详细实例说明+典型案例实现 对递归法进行全面分析 | C++
在上面,我们通过一个生活中的实例以及两个递归的典型问题,去详细的分析了递归法的核心思想和在程序中的具体实现过程。从程序设计语言的角度来说,谈到递归的定义,可以这样来描述:假如一个函数或子程序是由它自身所定义或调用的,就称它为递归。它至少要定义两个条件,一个是可以反复执行的递归过程,另一个是跳出执行过程的出口。
317 0
详细实例说明+典型案例实现 对递归法进行全面分析 | C++
|
分布式计算 大数据 Spark
Spark 原理_逻辑图_宽窄依赖判断 | 学习笔记
快速学习 Spark 原理_逻辑图_宽窄依赖判断
105 0
Spark 原理_逻辑图_宽窄依赖判断 | 学习笔记
|
JavaScript 前端开发
#yyds干货盘点#【js学习笔记四】数组双重去重的方式三filter
#yyds干货盘点#【js学习笔记四】数组双重去重的方式三filter
129 0
#yyds干货盘点#【js学习笔记四】数组双重去重的方式三filter
|
JavaScript 前端开发
#yyds干货盘点# 【js学习笔记五】数组双重去重的方式四先排序在对比
#yyds干货盘点# 【js学习笔记五】数组双重去重的方式四先排序在对比
93 0
#yyds干货盘点# 【js学习笔记五】数组双重去重的方式四先排序在对比