【问题标题】:Add-Recursion in Java, why ist the maximum so low? [duplicate]Java中的Add-Recursion,为什么最大值这么低? [复制]
【发布时间】:2015-06-12 05:40:07
【问题描述】:

我发现向自己添加数字(使用递归)的最大值是 21666。 要理解我的意思: 我们有数字 5,我们必须将下面的所有数字(包括 5)添加到它们自己。结果将是 15。 对于循环(带 in​​t),最大值是 int 最大值。 但是使用递归方法,最大值似乎是 21666。为什么会这样?

public class Rekursion {

    public static void main(String[] args) {
        int number = 21666;
        System.out.println("Result with a loop: " + add(number));
        System.out.println("Result with recursion: " + recursion(number));
    }

    public static int add(int x) {
        int sum = 0;
        for (int i = 0; i <= x; i++) {
            sum += i;
        }
        return sum;

    }

    public static int recursion(int x) {
        if (x==1){
            return 1;
        }
        else{
            return recursion(x-1)+x;
        }
    }

}

【问题讨论】:

  • 21667 会发生什么?堆栈溢出错误?
  • 太糟糕了,java不需要尾递归。
  • @assylias 是 StackOverflowError
  • 顺便说一下,1 + 2 + 3 + ... + n 的和等于n * (n + 1) / 2。不确定此代码是否只是针对给定问题或实际使用进行测试。
  • @Obicere 感谢Obicere,我首先想到的是带有循环的解决方案,效果很好。但是您的解决方案似乎更顺畅:D 谢谢!基本上这些是家庭作业,讲师想要一种随机方法和一种递归方法来解决“问题”。

标签: java loops recursion add


【解决方案1】:

每个递归调用都会分配一个栈帧。因此,您的堆栈空间不足。

【讨论】:

  • 特别是Java没有优化尾递归。
【解决方案2】:

这个数字不是一个幻数,它完全取决于您的环境和您的 JVM 可以使用的堆栈内存量。例如,它对我来说是 22000。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多