Как я могу оптимизировать рекурсию в плане?

#java #swing #recursion

#java #swing #рекурсия

Вопрос:

я хотел бы побродить по каждой стране пиксель за пикселем, но я сталкиваюсь с 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 amp;amp;  ujx xxx[i] <789 amp;amp; ujx xxx[i] >10 amp;amp; ujy yyy[i] < 630 amp;amp; ujy yyy[i]> 10  ){
                     img.setRGB(ujx, ujy,77);
                     bejar(ujx xxx[i], ujy yyy[i]);


             }
                 } 
     }

 public static void main(String[] args) {

     new Hajra();

 }
}
  

изображение:

Комментарии:

1. Вы могли бы «оптимизировать» его, не используя рекурсию. Рассмотрите возможность использования стека.

Ответ №1:

Java не оптимизирует хвостовую рекурсию, поэтому вы не можете действительно «оптимизировать рекурсию». У вас есть два варианта:

Решение 1 (простое) Запустите вашу программу со следующим флагом: -Xss128m Это даст вашему стеку 128 мегабайт памяти — так что у вашей рекурсии будет «больше места для дыхания». Вы также можете попробовать другие значения, если на вашем компьютере много памяти.

Решение 2 (сложнее) Измените свой алгоритм так, чтобы он не был рекурсивным (например, используйте стек). Каждый рекурсивный алгоритм может быть выражен как итеративное решение

Комментарии:

1. что это такое -Xss128m точно? как мне это использовать, как мне правильно запустить, что это значит? не могли бы вы немного подробнее остановиться на этом предмете?

2. Когда вы запустите свою java-программу, скажите: java -Xss128m <MyProgram> . Это настраивает размер стека потоков для каждого потока в вашем приложении на заданное вами значение

3. Как это сделать в Eclips или NetBeans?

4. Eclipse: проект -> Запустить как .. -> Запустить конфигурации -> Java-приложение -> Вкладка «Аргументы»