繁体   English   中英

终止 java 中的递归方法

[英]Terminating a recursive method in java

我有一个程序正在运行两个递归方法(这些方法添加了二维数组的行和列)。 这两种方法都按预期工作,但是我无法让它们在同一个主要方法体中运行。 我相信这是因为 rowsum 从未真正终止,因此 colsum 永远没有机会运行。 我该如何解决?

编辑:我还想补充一点,即使代码运行良好,我也会收到以下错误。 有什么解释吗?

错误

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    System.out.println("How many rows?: ");
    int rows = scan.nextInt();
    System.out.println("How many columns?: ");
    int cols = scan.nextInt();
    int[][] array = new int[rows][cols];
    for (int i = 0; i < array.length; i++) {
        for (int j = 0; j < array[0].length; j++) {
            array[i][j] = (int) Math.floor(Math.random() * 101);
        }
    }
    System.out.println(Arrays.deepToString(array));
    rowsum(array, 0);
    colsum(array, 0);
}

public static int rowsum(int array[][], int column) {
    int sum = 0;
    for (int i = 0; i < array.length; i++) {
        sum += array[column][i];
    }
    System.out.print("Sum of row " + column + ": " + sum + " | ");
    if (column >= array[0].length) {
        return 0;
    } else {
        return rowsum(array, column + 1);
    }
}

public static int colsum(int array[][], int row) {
    int sum = 0;
    for (int i = 0; i < array[0].length; i++) {
        sum += array[i][row];
    }
    System.out.print("Sum of column " + row + ": " + sum + " | ");
    if (row >= array.length) {
        return 0;
    } else {
        return colsum(array, row + 1);
    }
}

对于递归方法,您需要一个终止 state。 你只有一次回报,这意味着你将无限递归。 要终止,您需要一个返回 rowsum 以外的内容的条件(可能涉及列)。

列变得无限大,因此数组上存在数组索引越界错误。 你应该有

if (column >= 5) {
    return;
} else {
    return rowsum(...)
}

或者其他的东西

为了获得结果,您的递归方法需要一个停止条件。 在这种情况下,结束条件是行或列的结束。 当它到达列行的末尾时,它应该是所有条目的总和。

我必须说有更简单的方法可以做到这一点。 递归不是计算列表总和的最佳方法。 将采用一种更具迭代性的方法。

public static void main(String[] args) {

    Scanner scan = new Scanner(System.in);
    System.out.println("How many rows?: ");
    int rows = scan.nextInt();
    System.out.println("How many columns?: ");
    int cols = scan.nextInt();
    int[][] array = new int[rows][cols];
    for (int i = 0; i < array.length; i++) {
        for (int j = 0; j < array[0].length; j++) {
           array[i][j] = (int) Math.floor(Math.random() * 2);
        }
    }
    int sumOfRow = calculateSumOfRow(array, 0, 0, 0);//calculate the first row of the matrix
    int sumOfColumn = calculateSumOfColumn(array, 0, 0, 0);//calculate the first column of the matrix
    System.out.println("sum of row: " + sumOfRow);
    System.out.println("sum of col: " + sumOfColumn);
}

public static int calculateSumOfRow(int[][] integers , int rowToCalculate, int columnIndex, int sum) {
    if(columnIndex < integers[rowToCalculate].length) {
        sum += integers[rowToCalculate][columnIndex];
        return calculateSumOfRow(integers, rowToCalculate, ++columnIndex, sum);
    } else {
        return sum;
    }
}

public static int calculateSumOfColumn(int[][] integers , int columnToCalculate, int rowIndex, int sum) {
    if(rowIndex < integers.length) {
        sum += integers[rowIndex][columnToCalculate];
        return calculateSumOfColumn(integers, columnToCalculate, ++rowIndex, sum);
    } else {
        return sum;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM