递归的时候内存溢出一般用什么方法解决

alan19931103 2014-04-16 11:51:00
void showSurroundNum(){

//this.setBackground(new Color(225,238,210));
if(surround == -1){
this.setText("pop");
}else if(surround == 0){
for(Mine m:neighborMines){
m.showSurroundNum();//在这里递归的
}
}else {
this.setText((new Integer(surround)).toString());
}
}


运行的时候内存溢出了,用什么方法可以解决?
...全文
1255 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
alan19931103 2014-04-17
  • 打赏
  • 举报
回复
引用 11 楼 losebaby 的回复:
这个递归函数就没有一条对参数surround的设置,那岂不是说在递归开始进入哪个条件就永远在那里呆着了。 估计surround是0,所以。。。。。。 你扩再多了内存最后也是一个溢出错误
其他方法会修改surround,而且每次递归的surround不是同一个对象额。。。 这个不是很明显的么?
可乐罐 2014-04-17
  • 打赏
  • 举报
回复
这个递归函数就没有一条对参数surround的设置,那岂不是说在递归开始进入哪个条件就永远在那里呆着了。 估计surround是0,所以。。。。。。 你扩再多了内存最后也是一个溢出错误
冰思雨 2014-04-17
  • 打赏
  • 举报
回复
void showSurroundNum(){
 
        //this.setBackground(new Color(225,238,210));
        if(surround == -1){
            this.setText("pop");
        }else if(surround == 0){
            for(Mine m:neighborMines){
                //在这里递归的
                if(m.surround ==-1){
                   m..setText("pop");
                }else{
                    m..setText((new Integer(surround)).toString());
                }
            }
        }else {
            this.setText((new Integer(surround)).toString());
        }
    }
冰思雨 2014-04-17
  • 打赏
  • 举报
回复
引用 3 楼 alan19931103 的回复:
[quote=引用 2 楼 preferme 的回复:] 递归终止条件,一般有多种方式: 1. 添加递归深度参数到递归函数的参数中 每次调用深度加一,在函数体中添加条件语句,当深度超过某个值时强行return; 2. 引入元素栈结构,每次递归的一些需要记录的内容,通常会压入栈中,适当的时候再弹出 在函数体中,添加条件语句,判断栈大小或者栈元素,达到条件时进行return;
具体怎么实现,能帮写个伪代码么? 循环遍历的是一个ArrayList[/quote] 刚刚看了一下楼主的代码,发现这个不是传统意义上的递归调用,应该算作是嵌套调用,由于Mine对象的内置list遍历引起的死循环。 从设计上来讲,这个Mine类的showSurroundNum方法,存在严重的调用死循环问题。 解决这个问题,有两种方案: 一种是,showSurroundNum方法里,不再调用showSurroundNum方法,免去死循环的调用过程,把内部的showSurroundNum方法中的内容,用相同功能的语句进行替换,从而避免showSurroundNum的调用。 另一种是在showSurroundNum方法上添加参数,控制深度。
void showSurroundNum(int level){//初次调用是参数level填0
        if(level>1)return;//深度是1,那么进行一层的嵌套调用
        //this.setBackground(new Color(225,238,210));
        if(surround == -1){
            this.setText("pop");
        }else if(surround == 0){
            for(Mine m:neighborMines){
                m.showSurroundNum(level+1);//在这里递归的
            }
        }else {
            this.setText((new Integer(surround)).toString());
        }
    }
alan19931103 2014-04-16
  • 打赏
  • 举报
回复
引用 2 楼 preferme 的回复:
递归终止条件,一般有多种方式: 1. 添加递归深度参数到递归函数的参数中 每次调用深度加一,在函数体中添加条件语句,当深度超过某个值时强行return; 2. 引入元素栈结构,每次递归的一些需要记录的内容,通常会压入栈中,适当的时候再弹出 在函数体中,添加条件语句,判断栈大小或者栈元素,达到条件时进行return;
具体怎么实现,能帮写个伪代码么? 循环遍历的是一个ArrayList
冰思雨 2014-04-16
  • 打赏
  • 举报
回复
递归终止条件,一般有多种方式: 1. 添加递归深度参数到递归函数的参数中 每次调用深度加一,在函数体中添加条件语句,当深度超过某个值时强行return; 2. 引入元素栈结构,每次递归的一些需要记录的内容,通常会压入栈中,适当的时候再弹出 在函数体中,添加条件语句,判断栈大小或者栈元素,达到条件时进行return;
冰思雨 2014-04-16
  • 打赏
  • 举报
回复
添加递归终止条件,让递归返回。
alan19931103 2014-04-16
  • 打赏
  • 举报
回复
引用 8 楼 sducaicai 的回复:
surround的值貌似始终都是0阿
我这里的代码都没贴surround的定义,你怎么能说是始终是0.。。。。
alan19931103 2014-04-16
  • 打赏
  • 举报
回复
引用 8 楼 sducaicai 的回复:
surround的值貌似始终都是0阿
不同的对象值不一样
sducaicai 2014-04-16
  • 打赏
  • 举报
回复
surround的值貌似始终都是0阿
alan19931103 2014-04-16
  • 打赏
  • 举报
回复
引用 6 楼 foolishdault 的回复:
修改jvm参数,增加内存。但是治标不治本
目前好像已经是512了
铁匠梁老师 2014-04-16
  • 打赏
  • 举报
回复
修改jvm参数,增加内存。但是治标不治本
alan19931103 2014-04-16
  • 打赏
  • 举报
回复
引用 4 楼 levelmini 的回复:
我没猜错的话你这个方法就是写在Mine这个类里面的吧?我不知道你是怎么设计的,为什么要在Mine类里面的集合还装Mine类型的数据。或许你应该这样写
是的,是在Mine里面的。 改了以后还是溢出了,我觉得你的写法没有本质变化啊?还是会递归多层,然后内存溢出
levelnini 2014-04-16
  • 打赏
  • 举报
回复
引用 楼主 alan19931103 的回复:
void showSurroundNum(){

		//this.setBackground(new Color(225,238,210));
		if(surround == -1){
			this.setText("pop");
		}else if(surround == 0){
			for(Mine m:neighborMines){
				m.showSurroundNum();//在这里递归的
			}
		}else {
			this.setText((new Integer(surround)).toString());
		}
	}
运行的时候内存溢出了,用什么方法可以解决?
我没猜错的话你这个方法就是写在Mine这个类里面的吧?我不知道你是怎么设计的,为什么要在Mine类里面的集合还装Mine类型的数据。或许你应该这样写
void showSurroundNum(){
for(Mine m:neighborMines){
		//this.setBackground(new Color(225,238,210));
		if(surround == -1){
			this.setText("pop");
		}else if(surround == 0){
			
				m.showSurroundNum();//在这里递归的
			
		}else {
			this.setText((new Integer(surround)).toString());
		}
}
	}

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧