递归求和栈溢出

时间:2016-07-07 11:47:43

标签: java recursion stack-overflow

我编写了一个Java递归方法,用于计算从0到n的n的总和。这是代码:

private static long sum (long n) {
    if (n == 0) {
        return 0;
    } else {
        return n + sum(n-1);
    }
}

当我传递11000及以上的大数字时,有时会发生堆栈溢出。是的,我有时说。当n大于或等于11000时,程序运行并给出答案或堆栈溢出。

有谁可以解释发生了什么?

2 个答案:

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

每次调用方法时,都需要在调用堆栈上为该方法调用分配空间,以便存储对局部变量和方法参数等的引用。

堆栈位于地址空间的顶部,从上到下分配。在地址空间的底部是堆,从下到上分配。一旦处理完该方法,它就会从堆栈中弹出。

基本上你的方法将继续在每次调用时在堆栈上分配内存,如果调用太多,堆栈最终会进入堆中。此时,您正在尝试声明已经使用的内存,并最终以堆栈溢出的形式出现分段错误。

这是大多数时候通常不鼓励递归实现的部分原因。