开发者学堂课程【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(99999999
I
)//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) // nu
m
变化的数
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("执行完毕的时间dat
e2
” + 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秒,影响效率不大,但是递归存在使用陷阱。