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 } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |