Javada 2 Boyutlu Array’i Spiral Formda Ekrana Recursive(Özyineli) Yazdırma

Java Görseli
Java Görseli

Sitemizi takip eden kullanıcılar için içeriğimizin ingilizce açıklamasını da ekliyoruz.
(Print a given Array(Matrix) in spiral form in Java recursively)

Bu örnek de Javada 2 Boyutlu array’i spiral formda ekrana Recursive(Özyineli) yazdırmayı sizlere aktaracağız. Sitemizi takip eden yabancı kullanıcılar için ayrıca açıklamaları ingilizce olarak da aktararak onlara da destek olmaya artık başlıyoruz. Hadi geçelim örneğimize.

Örnek

Aşağıdaki örnek de olduğu gibi verilen 2D Arrayi ekrana spiral formda bastıran recursive kod ;
(Given a 2D array, print it in spiral form. See the following example)

 Array:
        1     2   3    4
        5     6    7    8
        9   10  11  12
        13  14  15  16

 Output(çıktı): 1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10

Örnek Görseli
Örnek Görseli

Kod array.java dosyasında program test edilmiştir. 

/***
     * This method prints 2D array on the screen in spiral format recursively.
     * To do this it uses a helper recursive method to Abstract implementation from user.
     * @param array 2D array will be printed.
     */
    public static void printArraySpiral(int[][] array){
        //we have 4 direction these are right,down,left,up;
        //directions numbers: right:1 , down: 2, left: 3, up:4
        //start with right
        int direction = 1;
        //start from [0][0]
        int x =0;
        int y =0;
        //set up boundaries
        int rowMin=0, rowMax =array.length-1, colMin = 0, colMax=array[0].length-1;
        //size start with 0 until all array is done
        int size=0;
        helperPrint (array,x,y,size,rowMin,rowMax,colMin,colMax,direction);
    }

    /***
     * A recursive helper method to print 2D array on the screen in spiral format recursively.
     * It is used to Abstract implementation from user.
     * @param arr 2D array will be printed
     * @param x current x coordinate of array.
     * @param y current y coordinate of array.
     * @param size a size starts from 0 until array size to stop recursion.
     * @param rowMin Minimum number of row in array(0)
     * @param rowMax Maximum number of row in array(row size)
     * @param colMin Minimum number of column in array(0)
     * @param colMax Maximum number of column in array(column size)
     * @param direction a direction when printing array.
     */
    private static void helperPrint(int[][] arr,int x,int y,int size,int rowMin,int rowMax ,int colMin,int colMax,int direction){
        if (size == arr.length*arr[0].length) //stop recursion
            return;
        System.out.print(arr[x][y] +" "); //print current cell with a space
        size++; //increment size
        boolean flag=false; //define a checker(it used to not damage adjusted values).
        //set up index values according to current situation and call function again
        if (direction == 1) { //right
            if (y == colMax) {
                direction = 2; //update to down
                rowMin++;
                x++;
                flag=true; //don't damage adjusted values
            } else {
                y++;
            }
        }

        if (direction == 2 && !flag) { //down
            if (x == rowMax) {
                direction = 3; //update to left
                colMax--;
                y--;
                flag=true; //don't damage adjusted values
            } else {
                x++;
            }
        }

        if (direction == 3 && !flag) { //left
            if (y == colMin) {
                direction = 4; //update to up
                rowMax--;
                x--;
                flag=true; //don't damage adjusted values
            } else {
                y--;
            }
        }

        if (direction == 4 && !flag) { //up
            if (x == rowMin) {
                direction = 1; //update to right
                colMin++;
                y++;
            } else {
                x--;
            }
        }
        helperPrint (arr, x, y, size, rowMin, rowMax, colMin, colMax, direction);
    }

Kod açıklaması

Bu örneği yapmak için bizler 2 ayrı method yazdık. 2 ayrı method yazmamızın sebebi kodu recursive olarak yazdığımız için methodumuza bazı ekstra parameter geçmek zorunda olduğumuz ve bu parametreleri kodu kullanan bir başka programcıdan gizlemek(soyutlamak) için yani methodu kullanan arkada ne olduğunu bilmiyor ve ayrıca bu parametrelerin olması gereken ilk değerlerini vermek(initialize).

Kısacası bizim direk çağırdığımız 1.public method parametrelerimizin ilk değerlerini veriyor(initialize) 2. Method asıl işi recursive olarak yaparak arrayimizi spiral form’da ekrana bastırıyor.

Recursive methodda yaptığımız iş ise kısaca şudur ; Dizinin index değerlerini ve diğer bazı değerleri kullanarak her yinelemeli(recursive) çağrıda, ekranda doğru değeri yazdırıyor. Bunu yapmak için bazı değerleri tutuyoruz ve basit matematik kullanarak bu değerlerle oynayarak ve kontrol ederek, problemi çözüyoruz. Sayıları değiştirdiğimizde, yönleri kontrol ediyoruz. Bu soru için yönler önemlidir.(sağ,sol aşşağı,yukarı)

(Explain of how to get solution)

In each recursive call by using index values of array and some other values it prints correct value on the screen. To do this we keep some values and by playing and checking these values by using observation and simple mathematic we solve the asked problem. When we change the numbers, we are checking the directions. Directions are important for this question.

Akif Kartal
Bilgisayar Mühendisi
Github: https://github.com/akifkartal03
Linkedin: https://www.linkedin.com/in/akif-kartal-03/
Twitter:  https://twitter.com/akifkartal3