【问题标题】:How to make code runs only once after recursion?如何使代码在递归后只运行一次?
【发布时间】:2019-10-07 19:42:45
【问题描述】:

hourglassSum(arr) 方法一开始是从 main 方法调用的。然后该方法是递归的,直到语句失败。递归后,执行 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]+"  ");
    }
}     

【问题讨论】:

  • 您能否发布输入和预期输出以及您得到的输出

标签: java arrays recursion break


【解决方案1】:

你的代码没有解释清楚.. 您可以在函数调用中添加一个布尔对象,并在完成递归时将其设置为 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] + "  ");
    }
}

注意:调用 hourglassSum(arr,true)

【讨论】:

    【解决方案2】:

    我认为您可能正在寻找的是包装函数。就目前而言,您的 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()做成一个包装函数,其唯一目的是调用helper方法,然后打印出结果:

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

    现在当你调用hourglassSum()时,它会调用helper方法,然后只有从方法返回时才会打印一次答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-28
      • 2019-10-31
      • 2014-05-01
      • 2016-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多