【问题标题】:How can i optimize the recursion in the plan?如何优化计划中的递归?
【发布时间】:2014-06-18 15:40:25
【问题描述】:

我想逐个像素地漫游每一块土地,但我在较大的国家(俄罗斯、法国)遇到了 stackoverflow。如何优化递归?

public class Hajra extends JFrame {

    public int [] xxx={-1,-1,-1,0,1,1,1,0};
    public int [] yyy={-1,0,1,1,1,0,1,-1};
    public BufferedImage    img;
     public long a,b; 
     public boolean ok = false;
     public int x,y;
    Hajra(){
         setBounds(50,50,770,609);
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            setVisible(true);
            setResizable(false);
            setContentPane(new JLabel(new ImageIcon("C:/Users/Isti/workspace/preprocess/backgroud.jpg")));

             try{
                    img=ImageIO.read(new File("C:/Users/Isti/workspace/preprocess/backgroud.jpg"));
                    } catch (IOException t) {
                        // TODO Auto-generated catch block
                        t.printStackTrace();
                        }

         this.addMouseListener(new MouseListener() {

            @Override
            public void mouseReleased(MouseEvent arg0) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mousePressed(MouseEvent arg0) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseExited(MouseEvent arg0) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseEntered(MouseEvent arg0) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseClicked(MouseEvent e) {
                 x = e.getX();
                 y = e.getY();
                a = img.getRGB(x, y);
                if(Math.abs(a)<600000){
                bejar(x+15,y+5);}
                File f = new File("MyFileee2.png");
                try {
                    ImageIO.write(img, "PNG", f);
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }
        });
     }

     void bejar ( int ujx , int ujy){

             for(int i=0;i<8;i++){   
                ///System.out.println(  "---"+ ujx + "  " + ujy+   " \n");
                 if(Math.abs(Math.abs(a)-Math.abs(img.getRGB(ujx+xxx[i], ujy+yyy[i])))< 600000 &&  ujx+xxx[i] <789 && ujx+xxx[i] >10 && ujy+yyy[i] < 630 && ujy+yyy[i]> 10  ){
                     img.setRGB(ujx, ujy,77);
                     bejar(ujx+xxx[i], ujy+yyy[i]);


             }
                 } 
     }

 public static void main(String[] args) {

     new Hajra();

 }
}

图片:

【问题讨论】:

  • 您可以通过不使用递归来“优化”它。考虑使用堆栈。

标签: java swing recursion


【解决方案1】:

Java 不优化尾递归,因此您无法真正“优化递归”。你有两个选择:

解决方案 1(简单) 使用以下标志运行您的程序:-Xss128m 这将为您的堆栈提供 128 兆的内存 - 因此您的递归有“更多的呼吸空间”。如果您的机器有很多内存,您也可以尝试其他值。

解决方案 2(更难) 修改您的算法,使其 递归(例如使用堆栈)。每个递归算法都可以表示为一个迭代解

【讨论】:

  • 这个-Xss128m到底是什么?我如何使用它,我如何正确运行,它是什么意思?你能详细说明一下这个主题吗?
  • 当你启动你的java程序时,说:java -Xss128m 。这会将应用程序中每个线程的线程堆栈大小配置为您设置的值
  • 在 Eclips 或 NetBeans 中如何?
  • Eclipse: 项目 -> 运行方式.. -> 运行配置 -> Java 应用程序 -> “参数”选项卡
猜你喜欢
  • 2010-12-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-18
相关资源
最近更新 更多