最近复习scala时突然想到的问题,就是尾递归和for循环的效率问题,闲来无聊就做了个测试,
先说结果,在5000次循环/递归下,并无明显差别。
代码如下:
/*
* Created by 九尾狸猫 at 2018/5/7
*
*/
object LoopVStailrec {
def main(args: Array[String]): Unit = {
// for(i <- 0 to Int.MaxValue){
val i =5000
val start = System.currentTimeMillis()
for(j <-0 to i) Thread.sleep(1)
val midel = System.currentTimeMillis()
loop(i)
val end = System.currentTimeMillis()
val for_time = midel-start
val rec_time = end-midel
if(i %10 ==0)println(i+"\t"+for_time+"\t"+rec_time)
// }
}
@scala.annotation.tailrec
def loop(iterator:Int):Unit = {Thread.sleep(1);if(iterator>0)loop(iterator-1)}
}
后来查了一下scala底层对尾递归的优化到底是怎么回事。scala底层将尾递归函数尽可能的转换为for循环,所以底层上for循环和尾递归是一样的;但要注意,由于scala是运行在jvm上的,所以有部分递归是无法进行优化的,能被scala优化的尾递归需要满足以下条件:
1.尾部调用;
2.是最终本地方法;
3.自调用;
以下代码段由于是间接调用所以无法被优化:
def odd1(n: Int): Boolean = {
if (n == 0) false
else even1(n - 1)
}
def even1(n: Int): Boolean = {
if (n == 0) true
else odd1(n - 1)
}
even1(9999)