Java 为什么递归地用随机数填充LinkedList时会出现StackOverflowException?
我需要以下方法的帮助: 我们的任务是用head编写一个递归方法: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()*
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返回一个布尔值。我已经没有任何想法了,你能给我一个提示吗
问候DanielFGAn--
是你的问题。在递减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--
存在多个问题:
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;
}