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

Java 为什么递归地用随机数填充LinkedList时会出现StackOverflowException?,java,list,recursion,linked-list,Java,List,Recursion,Linked List,我需要以下方法的帮助: 我们的任务是用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()*

我需要以下方法的帮助:

我们的任务是用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--));
}
公共静态列表生成器域(int start、int end、int n){
如果(n==0),则返回null;
int random=((int)(Math.random()*((end+1)-start)+start));
List randomList=newlinkedlist();
随机列表。添加(随机);
返回randomList.addAll(generateRandoms(start,end,n--));
}
问题是,这不起作用,因为addAll返回一个布尔值。我已经没有任何想法了,你能给我一个提示吗

问候DanielFGA

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

试一试

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

if (n == 0) return new LinkedList<>();
if(n==0)返回新的LinkedList();
还有。

三项改进:

  • 不要返回
    NULL
    。这是为了防止获得
    NullPointerException
    。相反

    if(n == 0)
    return new LinkedList<Integer>();  
    
    有以下两种说法:

    randomList.addAll( generateRandoms(start, end, n-1) );
    return randomList;
    
    这是因为,正如您所说,
    addAll()
    返回
    boolean

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

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

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


  • 存在多个问题:

  • 与直接返回addAll调用返回的值不同,您必须将其拆分为两个操作。首先将所有添加到randomList并返回该randomList

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

  • 您不能让您的方法返回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;
    }
    
    公共静态列表生成器域(int start、int end、int n){
    if(n==0)返回Collections.emptyList();
    int random=((int)(Math.random()*((end+1)-start)+start));
    List randomList=新建LinkedList();
    随机列表。添加(随机);
    addAll(generateRandoms(start,end,--n));
    返回随机列表;
    }
    

  • 这不管用/这里我得到了一个StackOverflowerError异常。如果您看一下API:它清楚地指出,方法
    addAll()
    对于成功更改的列表返回一个带true的布尔值,否则返回false。只需将return语句放在外面(不带return),然后在后面添加另一行代码,并使用:
    return-randomList然后我得到一个StackOverflower错误:/n您可以尝试
    Arrays.asList(randomList.addAll(generateRandoms(start,end,n--))n--
    做什么吗?也许您应该使用调试器逐步检查代码,看看要传递给递归的
    n
    的值。谢谢。该方法未运行,但异常较小:D@DanielFGA您将得到一个
    NullPointerException
    。这就是该方法无法运行的原因。
    randomList.addAll( generateRandoms(start, end, n-1) );
    return randomList;
    
    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;
    }