解决方案 »

  1.   

    递归终止条件,一般有多种方式:
    1.  添加递归深度参数到递归函数的参数中
        每次调用深度加一,在函数体中添加条件语句,当深度超过某个值时强行return;
    2.  引入元素栈结构,每次递归的一些需要记录的内容,通常会压入栈中,适当的时候再弹出
        在函数体中,添加条件语句,判断栈大小或者栈元素,达到条件时进行return;
      

  2.   


    具体怎么实现,能帮写个伪代码么?
    循环遍历的是一个ArrayList
      

  3.   


    我没猜错的话你这个方法就是写在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());
    }
    }
    }
      

  4.   


    是的,是在Mine里面的。改了以后还是溢出了,我觉得你的写法没有本质变化啊?还是会递归多层,然后内存溢出
      

  5.   

    修改jvm参数,增加内存。但是治标不治本
      

  6.   

    我这里的代码都没贴surround的定义,你怎么能说是始终是0.。
      

  7.   

    这个递归函数就没有一条对参数surround的设置,那岂不是说在递归开始进入哪个条件就永远在那里呆着了。估计surround是0,所以你扩再多了内存最后也是一个溢出错误
      

  8.   


    其他方法会修改surround,而且每次递归的surround不是同一个对象额这个不是很明显的么?
      

  9.   


    具体怎么实现,能帮写个伪代码么?
    循环遍历的是一个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());
            }
        }
      

  10.   

    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());
            }
        }