如何在SCALA中使用递归。 java.lang.StackOverflowError

时间:2018-07-03 11:47:35

标签: scala recursion

因此,当我尝试计算数学exp时,我遇到了一个错误:

  

“线程[DTsystem-akka.actor.default-dispatcher-5]发生未捕获的错误:null,因为为ActorSystem [DTsystem]启用了“ akka.jvm-exit-on-致命错误”,所以关闭了JVM   java.lang.StackOverflowError“

可能是什么问题?

def counter(n:Seq[Int]):Seq[Int]={
//count differences
val x = n.sliding(2,1).toList.map(x=> (x(1)-x(0)).toDouble)
//count how many times occurs each element of the list
val y = x.groupBy(i=>i).map(i => (i._1, i._2.size.toDouble)).toList
//count math expectation  
val z = y.map(i=>(i._1, (i._2*1)/x.length))
val g = z.map(i=>i._1*i._2).sum.toInt
val fin = n.last+g
var arr = new ListBuffer[Int]()
arr+=fin
if (arr.last<100) counter(n)
else arr
}

1 个答案:

答案 0 :(得分:3)

上面的代码本质上说:

def counter(n: Seq[Int]): Seq[Int] = {
  val fin = someFunnyFunction(n)
  if (fin < 100) throw new StackOverflowError
  else ListBuffer(fin)
}

,也就是说,每当fin小于100时,您的代码就会说递归永远不会终止,并且程序会因StackOverflowError而崩溃。例如,对于n = 1 to 10,以上代码将与g = 1fin = 11一起进行永恒递归。

形状的递归调用

def foo(x): Bar = {
  ...
  foo(x)
  ...
}
在最佳案例中,

是无用的,在其他所有案例中,它们都是有害的。