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

相关文章
|
3天前
|
SQL 算法
基于若依的ruoyi-nbcio流程管理系统修改代码生成的sql菜单id修改成递增id(谨慎修改,大并发分布式有弊端)
基于若依的ruoyi-nbcio流程管理系统修改代码生成的sql菜单id修改成递增id(谨慎修改,大并发分布式有弊端)
14 1
|
3天前
|
机器学习/深度学习 人工智能 PyTorch
人工智能平台PAI 操作报错合集之机器学习PAI把SequenceFeature直接送入BST模块,但发现未配置sequence_combiner会报错,如何解决
阿里云人工智能平台PAI (Platform for Artificial Intelligence) 是阿里云推出的一套全面、易用的机器学习和深度学习平台,旨在帮助企业、开发者和数据科学家快速构建、训练、部署和管理人工智能模型。在使用阿里云人工智能平台PAI进行操作时,可能会遇到各种类型的错误。以下列举了一些常见的报错情况及其可能的原因和解决方法。
|
10月前
随机ID生成的几种 方式整理(现阶段基础)
随机ID生成的几种 方式整理(现阶段基础)
208 1
|
11月前
|
JavaScript 前端开发 数据可视化
列表封装-递归数据回显-全局数据挂载——基础积累
列表封装-递归数据回显-全局数据挂载——基础积累
76 0
|
11月前
|
存储 JSON 前端开发
Android数据库存储模块封装,让操作记录更好用可复用
Android数据库存储模块封装,让操作记录更好用可复用
|
人工智能 算法 Java
详细实例说明+典型案例实现 对递归法进行全面分析 | C++
在上面,我们通过一个生活中的实例以及两个递归的典型问题,去详细的分析了递归法的核心思想和在程序中的具体实现过程。从程序设计语言的角度来说,谈到递归的定义,可以这样来描述:假如一个函数或子程序是由它自身所定义或调用的,就称它为递归。它至少要定义两个条件,一个是可以反复执行的递归过程,另一个是跳出执行过程的出口。
198 0
详细实例说明+典型案例实现 对递归法进行全面分析 | C++
|
前端开发
前端项目实战45-加一层判断 否则影响项目执行
前端项目实战45-加一层判断 否则影响项目执行
48 0
|
前端开发
前端工作总结250-uni-扩展运算符实现拼接合并操作
前端工作总结250-uni-扩展运算符实现拼接合并操作
83 0
|
SQL 数据库
把业务逻辑变成数据结构和SQL语句的例子。自然架构改成自然框架
    更正:和大家交流了一下,发现现在就叫做架构有一点大,还是叫做框架更准确一些,就叫做自然框架吧。     目前自然框架的内容包括三个部分:使用自定义控件快速实现增删改查和导出Excel、通用权限、个性化设置。
1031 0
|
数据库
【自然框架 NatureFW】里的两种“映射”方式
   自然框架里面采用了两种映射关系,一个是流行的ORM,另一是非主流的“CCM ” (我自己想的,呵呵)。   先说一下ORM。ORM是O和R的映射关系。也看到很多人写关于ORM的文章,发现好像有个误区。
923 0