Как сделать так, чтобы код запускался только один раз после рекурсии? - PullRequest
1 голос
/ 07 октября 2019

hourglassSum (arr) метод вызывается из основного метода в начале. тогда метод рекурсивный, пока оператор не потерпит неудачу. после рекурсии выполняется итерация sumArray. Я думал, что это будет выполнено только один раз. но это не работает, как я ожидал. Как заставить его запускаться только один раз после рекурсии?

Я пытался установить флаг как локальную переменную.

Запустить следующий код

static int rowIncrement=0;
static int columnIncrement=0;
static int[] sumArray = new int[16];
static int count=0;
static void hourglassSum(int[][] arr) {
    int sum=0;
    int size=arr.length/2;
    for(int i=rowIncrement;i<size+rowIncrement;i++) {
        for(int j=columnIncrement;j<size+columnIncrement;j++) {
            sum = sum+arr[i][j];
            System.out.print(arr[i][j]+" ");
        }
        System.out.println();
    }
    System.out.println(sum);
    sumArray[count]=sum;
    System.out.println();
    columnIncrement++;
    if(columnIncrement==(arr.length/2)+1) {
        rowIncrement++;
        columnIncrement=0;
    }
    if(rowIncrement<(arr.length/2)+1) {
        count++;
        hourglassSum(arr);
    }
    //doubt : is it execute only once.
    for(int i=0;i<sumArray.length;i++) {
        System.out.println(sumArray[i]+"  ");
    }
}     

Ответы [ 2 ]

0 голосов
/ 07 октября 2019

Я думаю, что вы можете искать, это функция-обертка. В текущем состоянии цикл for выполняется внутри рекурсивного метода, поэтому каждый раз, когда вызывается этот метод, он запускает цикл for. Похоже, вы хотите, чтобы он запустил рекурсивный метод, а затем в конце распечатал результат. Для этого вы можете поместить весь рекурсивный код в так называемый вспомогательный метод и назвать его hourglassSumHelper() или что-то в этом роде:

private static void hourglassSumHelper(int[][] arr) {
    int sum=0;
    int size=arr.length/2;
    for(int i=rowIncrement;i<size+rowIncrement;i++) {
        for(int j=columnIncrement;j<size+columnIncrement;j++) {
            sum = sum+arr[i][j];
            System.out.print(arr[i][j]+" ");
        }
        System.out.println();
    }
    System.out.println(sum);
    sumArray[count]=sum;
    System.out.println();
    columnIncrement++;
    if(columnIncrement==(arr.length/2)+1) {
        rowIncrement++;
        columnIncrement=0;
    }
    if(rowIncrement<(arr.length/2)+1) {
        count++;
        hourglassSumHelper(arr); // Make sure you change the recursive call as well
    }
} 

Затем сделать hourglassSum() функцией-оберткой, единственная цель которой -чтобы вызвать вспомогательный метод, затем распечатать результат:

static void hourglassSum(int[][] arr) {
    hourglassSumHelper(arr);
    for(int i=0;i<sumArray.length;i++) {
        System.out.println(sumArray[i]+"  ");
    }
}

Теперь, когда вы вызываете hourglassSum(), он вызовет вспомогательный метод, и только тогда, когда он вернется из метода, он распечатаетответь один раз.

0 голосов
/ 07 октября 2019

то, что делает ваш код, не объясняется четко .. вы можете добавить логический объект к вызову функции и установить его в false при завершении рекурсии, см. Следующее:

private static void hourglassSum(int[][] arr,Boolean bool) {
    int sum = 0;
    int size = arr.length / 2;
    for (int i = rowIncrement; i < size + rowIncrement; i++) {
        for (int j = columnIncrement; j < size + columnIncrement; j++) {
            sum = sum + arr[i][j];
            System.out.print(arr[i][j] + " ");
        }
        System.out.println();
    }
    System.out.println(sum);
    sumArray[count] = sum;
    System.out.println();
    columnIncrement++;
    if (columnIncrement == (arr.length / 2) + 1) {
        rowIncrement++;
        columnIncrement = 0;
    }
    if (rowIncrement < (arr.length / 2) + 1) {
        count++;
        hourglassSum(arr,bool);
        if(bool){
            bool=false;
            return;
        }
    }
    System.out.println("out");
    //doubt : is it execute only once.
    for (int i = 0; i < sumArray.length; i++) {
        System.out.println(sumArray[i] + "  ");
    }
}

ПРИМЕЧАНИЕ: call hourglassSum (обр, правда)

...