传统方式和递归方式速度 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秒,影响效率不大,但是递归存在使用陷阱。

相关文章
|
4月前
|
SQL 索引
业务系统架构实践问题之想要再SQL代码中生成递增序列,那么步骤问题如何解决
业务系统架构实践问题之想要再SQL代码中生成递增序列,那么步骤问题如何解决
|
5月前
|
存储 关系型数据库 MySQL
索引的威力--记一次MySQL存储过程优化
在MySQL存储过程中,一个`INSERT INTO SELECT`语句起初执行超过130秒,优化后,执行时间降低到1秒内,实现了100倍的性能提升。问题在于`NOT IN`子查询导致的慢查询,最终通过创建单列索引获得了最佳效果。文章还介绍了索引创建的基本语法,并讨论了单列索引与组合索引的优缺点。作者强调,随着数据量增加,索引对于查询性能的重要性,计划未来采用读写分离来进一步优化处理大量插入和查询的场景。
126 0
随机ID生成的几种 方式整理(现阶段基础)
随机ID生成的几种 方式整理(现阶段基础)
354 1
|
JavaScript 前端开发 数据可视化
列表封装-递归数据回显-全局数据挂载——基础积累
列表封装-递归数据回显-全局数据挂载——基础积累
100 0
|
人工智能 算法 Java
详细实例说明+典型案例实现 对递归法进行全面分析 | C++
在上面,我们通过一个生活中的实例以及两个递归的典型问题,去详细的分析了递归法的核心思想和在程序中的具体实现过程。从程序设计语言的角度来说,谈到递归的定义,可以这样来描述:假如一个函数或子程序是由它自身所定义或调用的,就称它为递归。它至少要定义两个条件,一个是可以反复执行的递归过程,另一个是跳出执行过程的出口。
301 0
详细实例说明+典型案例实现 对递归法进行全面分析 | C++
|
数据库 索引 大数据
这才是真正的表扩展方案
事情变得有意思了,上一篇花1小时撰写的“一分钟”文章,又引起了广泛的讨论,说明相关的技术大家感兴趣,挺好。第一次一篇技术文章的评论量过100,才知道原来“评论精选”还有100上限,甚为欣慰(虽然是以一种自己不愿看到的方式)。
656 0
|
SQL 数据库
把业务逻辑变成数据结构和SQL语句的例子。自然架构改成自然框架
    更正:和大家交流了一下,发现现在就叫做架构有一点大,还是叫做框架更准确一些,就叫做自然框架吧。     目前自然框架的内容包括三个部分:使用自定义控件快速实现增删改查和导出Excel、通用权限、个性化设置。
1050 0
|
数据库
【自然框架 NatureFW】里的两种“映射”方式
   自然框架里面采用了两种映射关系,一个是流行的ORM,另一是非主流的“CCM ” (我自己想的,呵呵)。   先说一下ORM。ORM是O和R的映射关系。也看到很多人写关于ORM的文章,发现好像有个误区。
947 0
|
SQL
【自然框架】 之 资源角色——列表过滤方案(思路篇)
名词解释 1、资源角色,我的理解就是资源过滤方案 + 角色。就是把资源过滤方案和角色结合在一起的东东。2、资源:这里的资源指的是关系数据库里的记录。3、资源过滤:就是按照一定的条件提取数据库里的记录。
898 0