递归的时候内存溢出一般用什么方法解决 内存溢出递归java 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 递归终止条件,一般有多种方式:1. 添加递归深度参数到递归函数的参数中 每次调用深度加一,在函数体中添加条件语句,当深度超过某个值时强行return;2. 引入元素栈结构,每次递归的一些需要记录的内容,通常会压入栈中,适当的时候再弹出 在函数体中,添加条件语句,判断栈大小或者栈元素,达到条件时进行return; 具体怎么实现,能帮写个伪代码么?循环遍历的是一个ArrayList 我没猜错的话你这个方法就是写在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()); }} } 是的,是在Mine里面的。改了以后还是溢出了,我觉得你的写法没有本质变化啊?还是会递归多层,然后内存溢出 修改jvm参数,增加内存。但是治标不治本 我这里的代码都没贴surround的定义,你怎么能说是始终是0.。 这个递归函数就没有一条对参数surround的设置,那岂不是说在递归开始进入哪个条件就永远在那里呆着了。估计surround是0,所以你扩再多了内存最后也是一个溢出错误 其他方法会修改surround,而且每次递归的surround不是同一个对象额这个不是很明显的么? 具体怎么实现,能帮写个伪代码么?循环遍历的是一个ArrayList刚刚看了一下楼主的代码,发现这个不是传统意义上的递归调用,应该算作是嵌套调用,由于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()); } } 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()); } } 关于IOException 求一个求最大素数的程序 我想学习JAVA,想问一下JAVA是什么 Java的InputStream和Reader的问题,高手进,悬赏50分! 接收服务器端数据日文乱码问题。 我也发个测智商的题目! 一个严重的问题!!!!! 我今天才开始接触JAVA,希望大家能给点建议!我急需要一本JAVA基础的书籍!谢谢 jdbc中的复合查询如何实现? Parser无法接受中文文件名? 为什么父类的静态方法没有被重写? 请问这中写法怎么防止空指针异常?while ((lexeme = iks.next()) != null) {
1. 添加递归深度参数到递归函数的参数中
每次调用深度加一,在函数体中添加条件语句,当深度超过某个值时强行return;
2. 引入元素栈结构,每次递归的一些需要记录的内容,通常会压入栈中,适当的时候再弹出
在函数体中,添加条件语句,判断栈大小或者栈元素,达到条件时进行return;
具体怎么实现,能帮写个伪代码么?
循环遍历的是一个ArrayList
我没猜错的话你这个方法就是写在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());
}
}
}
是的,是在Mine里面的。改了以后还是溢出了,我觉得你的写法没有本质变化啊?还是会递归多层,然后内存溢出
其他方法会修改surround,而且每次递归的surround不是同一个对象额这个不是很明显的么?
具体怎么实现,能帮写个伪代码么?
循环遍历的是一个ArrayList
刚刚看了一下楼主的代码,发现这个不是传统意义上的递归调用,应该算作是嵌套调用,由于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());
}
}
//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());
}
}