有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么递归地用随机数填充LinkedList时会出现StackOverflowException?

我需要以下方法的帮助:

我们的任务是用head编写一个递归方法:

generateRandoms(int start,int end, int n)

该方法应在开始结束之间生成n随机数

这就是我得到的:

public static List<Integer> generateRandoms(int start,int end, int n) {
    if (n == 0) return null;
    int random = ((int) (Math.random()*((end+1)-start)+start));
    List<Integer> randomList = new LinkedList <Integer>();
    randomList.add(random);
    return randomList.addAll(generateRandoms(start, end, n--));
}

问题是,这不起作用,因为addAll返回一个布尔值。我已经没有任何想法了,你能给我一个提示吗

你好,丹尼尔加


共 (3) 个答案

  1. # 1 楼答案

    n 是你的问题。在递减n之前进行递归调用

    试一试

    return randomList.addAll(generateRandoms(start, end,  n));
    

    这将修复堆栈溢出。我还没有运行你的代码,但我认为你应该使用

    if (n == 0) return new LinkedList<>();
    

    还有

  2. # 2 楼答案

    三项改进:

    1. 不要返回NULL。这是为了防止得到NullPointerException。相反

      if(n == 0)
      return new LinkedList<Integer>();  
      

    1. 更改声明

      return randomList.addAll(generateRandoms(start, end, n ));
      

      有以下两种说法:

      randomList.addAll( generateRandoms(start, end, n-1) );
      return randomList;
      

      这是因为,正如您所说,addAll()返回boolean

      另外,对于StackOverflowException:抛出SOE是因为,正如@bradimus所说,您在更改n的值之前进行了递归调用

      (后缀减量运算符在使用当前值后更改变量的值)

      因此,n的值永远不会达到0,它会导致无限递归。因此,程序内存不足。用{}或{}更改{}

  3. # 3 楼答案

    存在多个问题:

    1. 与直接返回addAll调用返回的值不同,您必须将其拆分为两个操作。首先将所有内容添加到随机列表并返回该随机列表

    2. 正如其他人已经指出的,您不能使用n,因为这将首先通过n,然后在通过n后减小它。改用n或n-1

    3. 您不能让您的方法返回null,因为如果将null传递给addAll方法,它将抛出NullPointerException。而是返回一个空列表

      public static List<Integer> generateRandoms(int start,int end, int n) {
          if (n == 0) return Collections.emptyList();
          int random = ((int) (Math.random()*((end+1)-start)+start));
          List<Integer> randomList = new LinkedList<Integer>();
          randomList.add(random);
          randomList.addAll(generateRandoms(start, end,  n));
          return randomList;
      }