加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – @tailrec如何工作

发布时间:2020-12-16 19:10:18 所属栏目:安全 来源:网络整理
导读:我已经使用和阅读了关于@tailrec注释来具有尾递归方法.我已经经历了许多解释它的链接.例如,它只适用于自我调用功能,不应该被覆盖等. 无处不在,提到编译器优化.但是编译器做什么魔术/概念使其能够递归.对于下面的一个简单的函数,编译器做了什么: @tailrec de
我已经使用和阅读了关于@tailrec注释来具有尾递归方法.我已经经历了许多解释它的链接.例如,它只适用于自我调用功能,不应该被覆盖等.

无处不在,提到编译器优化.但是编译器做什么魔术/概念使其能够递归.对于下面的一个简单的函数,编译器做了什么:

@tailrec def fact(acc: Int,n: Int): Int = {
  if (n <= 1) acc
  else fact(n * acc,n - 1)
}
fact(1,10)

我的意思是它将它转换成一个循环,它反复调用它,然后返回最终值?有什么链接到纸,解释它

解决方法

除了我对你的问题的评论(重新代码在这里):

var acc = 1 
  var n = 10
start: 
  if (n <= 1) return acc 
  else { 
    acc = n * acc
    n = n - 1
    goto start
  }

我试图使用刚刚碰巧的最新版本,并用scalac -Xprint来编译事实方法:所有并且不知何故编译器发出一个icode文件.所以这真的说明了它如何优化尾呼:

// methods
  def fact(acc: Int (INT),n: Int (INT)): Int {
  locals: value acc,value n,value _$this
  startBlock: 1
  blocks: [1,2,3,4,5]

  1: 
    2   JUMP 2

  2: // huynhjl's comment: IF condition is here
    3   LOAD_LOCAL(value n)
    3   CONSTANT(1)
    3   CJUMP (INT)LE ? 3 : 4

  3: // huynhjl's comment: first branch of IF,will return acc
    3   LOAD_LOCAL(value acc)
    3   JUMP 5

  5: 
    2   RETURN(INT)

  4: // huynhjl's comment: else branch of IF,update acc and n and jump back
    4   LOAD_LOCAL(value n)
    4   LOAD_LOCAL(value acc)
    4   CALL_PRIMITIVE(Arithmetic(MUL,INT))
    4   LOAD_LOCAL(value n)
    4   CONSTANT(1)
    4   CALL_PRIMITIVE(Arithmetic(SUB,INT))
    4   STORE_LOCAL(value n)
    4   STORE_LOCAL(value acc)
    4   JUMP 2

  }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读