黑马程序员技术交流社区
标题:
是什么原因使内存溢出?死递归?
[打印本页]
作者:
邹学良
时间:
2013-3-7 14:44
标题:
是什么原因使内存溢出?死递归?
本帖最后由 邹学良 于 2013-3-8 08:36 编辑
public class Test2 {
public static int run(int x){
if(x==1){
return 1;
}else
{
return run(x+2);
}
}
public static void main(String[] args) {
System.out.print(run(50));
}
}
复制代码
本来想通过FOR循环求第50项数,但不知道怎么就内存溢出了
而且只要是调用RUN方法就报异常
作者:
lzw123451
时间:
2013-3-7 15:07
本帖最后由 李志卫 于 2013-3-7 15:29 编辑
for(int i=1;i<=50;i++){
run(i);
}
这段代码怎么回事,循环i,运行run方法, 但run方法执行后返回一个数,返回值却没有用一个变量来装,或者直接打印返回值。
如果你只需要 求第50项数 这个循环就不用了,直接System.out.print(run(50));
如果你要打印每一个数就在for循环哪里直接System.out.print(run(i));
抱歉,没看清楚 return run(x+2) 这个东西, 如果x!=1 就根本不会有返回值,就一直运行下去了。
作者:
黑马_位志国
时间:
2013-3-7 15:13
当调用run方法时,如果传入的参数不等于1,就会形成死循环,从而造成内存溢出
作者:
邹学良
时间:
2013-3-7 15:18
李志卫 发表于 2013-3-7 15:07
for(int i=1;i
是求前50项奇数之和演变过来的
没想到出现了异常,而且还不知道到底是怎么回事
现在就是想知道为什么有这个异常
作者:
王亚东
时间:
2013-3-7 15:22
不用for循环,只是方法内部调用方法本身就会死循环。只要到i>1,接着就会执行run(i+2),然后一直执行下去,直到内存溢出。
作者:
王智威
时间:
2013-3-7 16:16
本帖最后由 王智威 于 2013-3-7 16:48 编辑
我估计你还不太懂迭代的思想吧,用了迭代还用循环吗?
要49的之前的奇数,问47的,让这样推下去,是程序自己调用自己而不是你来用for调用。
我按你的要求写了个符合的程序。不知道行不行。
public class Test2 {
static int y=0;
static int k=0;
public static int run(int x){
if(x==1){
return -1;
}else
{
y=run(x-2)+2;
k=k+y;
System.out.println();
System.out.println("总数"+k+" 加上的"+y);
}
return y;
}
public static void main(String[] args) {
run(51);
}
}
作者:
谢洋
时间:
2013-3-7 17:32
1、程序没有结束的条件,导致死循环;
2、死循环不一定会内溢出,但递归的死循环一定会导致内存溢出;
原因:拿上面的run方法来说吧,首先明确这是个死循环,
当执行到run()方法的run()语句时,再次调用run方法,再去开辟空间;这时上一次run方法还没执行,就不会释放空间;
如此循环不断开辟新空间,直到执行完最后一个被调用的run,从最后一个run所占用的空间开始,逐级往回 回收空间,直到最先被执行的run;
但是这是个死循环,不会有最后一个run,导致不断开空间,结果就溢出了.
作者:
夏晓彤
时间:
2013-3-7 18:17
你传进去50,递归每次做50+2运算,你这结束判断是x==1,肯定死循环,内存溢出,想看到递归效果,可把return run(x+2)改下return run(x-1),但是你不能传进去一个特别大的数,大了还是会报错,内存溢出
作者:
HM李帅
时间:
2013-3-7 23:52
你循环的结束条件是x=1。但是参数50传进来之后是一直作的+2这个操作
也就是说离结束条件的1越来越远
形成了无限循环
那内存溢出也就是必然的了
作者:
HM李帅
时间:
2013-3-7 23:53
你循环的结束条件是x=1。但是参数50传进来之后是一直作的+2这个操作
也就是说离结束条件的1越来越远
形成了无限循环
那内存溢出也就是必然的了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2