scala – 当在对象上定义而不在类上定义时,方法是尾递归的
发布时间:2020-12-16 09:02:49 所属栏目:安全 来源:网络整理
导读:在对象上定义递归方法: object Recursive { def recurse(maxDepth: Int = 10): Unit = { if (maxDepth == 0) throw new Exception recurse(maxDepth - 1) }} 得到: scala Recursive.recurse(10)java.lang.Exception at Recursive$.recurse(console:7) at .
在对象上定义递归方法:
object Recursive { def recurse(maxDepth: Int = 10): Unit = { if (maxDepth == 0) throw new Exception recurse(maxDepth - 1) } } 得到: scala> Recursive.recurse(10) java.lang.Exception at Recursive$.recurse(<console>:7) at .<init>(<console>:7) at .<clinit>(<console>) at RequestResult$.<init>(<console>:9) at RequestResult$.<clinit>(<console>) at RequestResult$scala_repl_result(<console>) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at scala.tools.nsc.Interpreter$Request$$anonfun$loadAndRun$1$$anonfun$apply$17.apply(Interpreter.scala:988) at scala.tools.nsc.Interpreter$Request$$anonfun$loadAndRun$1$$anonfun$apply$17.apply(Interpreter.scala:988) at scala.util.control.Exception$Catch.apply(Exception.scal... 但是在课堂上定义它: class Recursive { def recurse(maxDepth: Int = 10): Unit = { if (maxDepth == 0) throw new Exception recurse(maxDepth - 1) } } 得到: scala> new Recursive recurse(10) java.lang.Exception at Recursive.recurse(<console>:7) at Recursive.recurse(<console>:8) at Recursive.recurse(<console>:8) at Recursive.recurse(<console>:8) at Recursive.recurse(<console>:8) at Recursive.recurse(<console>:8) at Recursive.recurse(<console>:8) at Recursive.recurse(<console>:8) at Recursive.recurse(<console>:8) at Recursive.recurse(<console>:8) at Recursive.recurse(<console>:8) at .<init>(<console>:7) at .<clinit>(<console>) at RequestResult$.<init>(<console>:9) at RequestResult$.<clinit>(<console>) at RequestResult$scala_repl_result(<console>) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcc.. 方法是相同的.为什么在类上定义时不是尾递归? 解决方法
如果要执行尾递归,则无法覆盖递归.如果recurse是可覆盖的,就像在类声明中那样,其中的任何递归都必须使用动态方法调用(因为它可能是多态的),不能对goto样式的语句进行优化.
对象单例声明静态地确保明确的recurse调用,并让编译器继续进行尾递归优化. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |