黑马程序员技术交流社区

标题: 是什么原因使内存溢出?死递归? [打印本页]

作者: 邹学良    时间: 2013-3-7 14:44
标题: 是什么原因使内存溢出?死递归?
本帖最后由 邹学良 于 2013-3-8 08:36 编辑
  1. public class Test2 {

  2. public static int run(int x){
  3. if(x==1){
  4. return 1;
  5. }else
  6. {
  7. return run(x+2);
  8. }
  9. }
  10. public static void main(String[] args) {
  11.       System.out.print(run(50));
  12. }
  13. }
复制代码
本来想通过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