美文网首页
Scala for循环与尾递归效率问题

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

作者: 丿九尾狸猫 | 来源:发表于2018-05-07 19:17 被阅读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)

    相关文章

      网友评论

          本文标题:Scala for循环与尾递归效率问题

          本文链接:https://www.haomeiwen.com/subject/aawvrftx.html