Scala for循环与尾递归效率问题

2018-05-07  本文已影响22人  丿九尾狸猫

最近复习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)

上一篇下一篇

猜你喜欢

热点阅读