提问者:小点点

如何在SCALA. java.lang.StackOverflow Error中使用递归


所以,当我尝试计算数学经验时,我有一个错误:

"来自线程[DTsystem-akka.actor. default-调度器-5]的未捕获错误:null,关闭JVM因为ActorSystem[DTsystem]java.lang.StackOverflow Error启用了'akka.jvm-exet-on-manty-error'"

会有什么问题?

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个答案

匿名用户

上面的代码基本上是这样说的:

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

也就是说,每当fin小于100时,你的代码说递归永远不应该终止,程序崩溃时会出现StackOverflow Error。例如,对于n=1到10,上面的代码进入g=1fin=11的永恒递归。

形状的递归调用

def foo(x): Bar = {
  ...
  foo(x)
  ...
}

在最好的情况下是无用的,在所有其他情况下都是有害的。