所以,当我尝试计算数学经验时,我有一个错误:
"来自线程[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
}
上面的代码基本上是这样说的:
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=1
和fin=11
的永恒递归。
形状的递归调用
def foo(x): Bar = {
...
foo(x)
...
}
在最好的情况下是无用的,在所有其他情况下都是有害的。