我编写了一个Java递归方法,用于计算从0到n的n的总和。这是代码:
private static long sum (long n) {
if (n == 0) {
return 0;
} else {
return n + sum(n-1);
}
}
当我传递11000及以上的大数字时,有时会发生堆栈溢出。是的,我有时说。当n大于或等于11000时,程序运行并给出答案或堆栈溢出。
有谁可以解释发生了什么?
答案 0 :(得分:1)
考虑使用For-Loop
a = Model.where(status:@statuses).group(:sub_group, :status).count
res = {}
a.each do |k,v|
c={}
if res.has_key?(k[0])
c[k[1]]=v
res[k[0]]=res[k[0]].merge(c)
else
c[k[1]]=v
res[k[0]]=c
end
end
当然,你可以使用一个奇特的公式:) 谢谢@Andy Turner
public static long sum(long n) {
long result = 0;
for (int i = 1; i <= n; i++) {
result += i;
}
return result;
}
您获得StackOverflow异常的原因是因为您生成的调用堆栈大于JVM期望的值。
答案 1 :(得分:0)
每次调用方法时,都需要在调用堆栈上为该方法调用分配空间,以便存储对局部变量和方法参数等的引用。
堆栈位于地址空间的顶部,从上到下分配。在地址空间的底部是堆,从下到上分配。一旦处理完该方法,它就会从堆栈中弹出。
基本上你的方法将继续在每次调用时在堆栈上分配内存,如果调用太多,堆栈最终会进入堆中。此时,您正在尝试声明已经使用的内存,并最终以堆栈溢出的形式出现分段错误。
这是大多数时候通常不鼓励递归实现的部分原因。