使用递归在2d数组中求和整数?

时间:2010-09-10 22:43:22

标签: java arrays recursion multidimensional-array

我需要一些帮助解决这个问题。我必须使用递归对二维数组中的所有整数求和。以下是我自己设法做的事情,但我被困住了。此代码生成总和14,应为18。

public class tablerecursion {
    public static void main(String[] args) {
        int[][] tabell = new int[][] { { 1, 2, 3 }, { 3, 2, 1 }, { 1, 2, 3 } };
        int sum = rec(tabell, 2, 2);
        System.out.println(sum);
    }

    static int rec(int[][] table, int n, int m) {
        if (m == 0)
            return table[n][0];
        if (n == 0)
            return table[0][m];
        System.out.println("n:" + n + "  m:" + m);

        return rec(table, n - 1, m) + rec(table, n, m - 1);
    }
}

有什么建议吗?基本情况是错的吗?或者递归方法是错误的?

7 个答案:

答案 0 :(得分:3)

我会用两个函数解决这个问题。首先创建一个可递归求和单个(1d)数组的函数。写一个函数,递归地将前一个函数与外部数组相加。

请记住,表[N]本身就是一个数组。您无需一次性访问它。

答案 1 :(得分:2)

您的递归逻辑错误。

你得到14因为你打电话

f(2,2)= f(2,1)+ f(1,2)=(f(2,0)+ f(1,1))+(f(1,1)+ f( 0,2))

f(0,2)是你的基本情况,3 f(0,2)是你的基本情况,1 f(1,1)= f(0,1)+ f(1,0)= 2 + 3 = 5

所以总和是3 + 1 + 5 + 5 = 14

用于递归的正确逻辑是单个递归函数:

以坐标(x,y)开头并以(z,w)结尾的2x2数组的总和是3件事的总和:

  xxxxxxxxxx
  xxxxxxxxxx
  xxxxxxxxxx
  yyyyyyyyyN
  • 包含除最后一行之外的所有行的数组的总和(上例中的xxxx-s) 所以(x,y)到(z,2-1)。

  • 一个由LAST行组成的数组的总和(右下角除外 - 例如yyyyy-s) 所以,(x,w)到(z-1,w)

  • 坐标处的数字(z,w)

  • 基本情况是,如果y> w(零线),则总和为零; 如果x

这实际上是一个双递归,理想情况下。一个是通过使用辅助“添加一行”函数递归计算所有行的总和 - 当然也是递归实现的。

答案 2 :(得分:0)

其他几个答案建议使用1D例程对列和2D阵列角落中元素相邻的行进行求和

BUT

将2D数组切割成四个较小的2D数组并以这种方式递归同样有效。当输入是1x1 2D数组时,停止条件当然是答案很简单。

跟进

除非阵列尺寸为2 ^ m x 2 ^ m,否则会遇到障碍;其他任何事情,迟早你遇到Nx1或1xN输入,你根本无法将其切割成四个子阵列。所以你最终还是不得不处理一维输入。

答案 3 :(得分:0)

请参阅此处是我要提交的内容,并指出递归解决方案不适用:

public static void Main()
{
        var a = new int[][] {  new int[] {1,2,3},
                               new int[] {3,2,1},
                               new int[] {1,2,3}  }; 
        int result = a.Sum(row => row.Sum());
        Console.WriteLine(result);
}

最好是正确而不是简单地认为正确。

答案 4 :(得分:0)

以下是可能解决方案的示例。如果java编译器可以优化尾递归那么它将与迭代解决方案一样高效。现在它非常积极地吃堆栈。

public static long countSum (int[][] matrix) {
    if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
        return 0;
    }
    return countSum (matrix, 0, 0, 0, matrix.length, matrix[0].length);
}

private static long countSum (int[][] matrix, long acc, int curI, int curJ, int maxI, int maxJ) {
    if (curI >= maxI) {
        return acc;
    }
    if (curJ >= maxJ) {
        return countSum(matrix, acc, curI + 1, 0, maxI, maxJ);
    }
    return countSum(matrix, acc + matrix[curI][curJ], curI, curJ + 1, maxI, maxJ);

}

答案 5 :(得分:0)

public int sumarmatriz(int matriz[][],int i,int j)
{
    if(i==0 && j==0){
        return matriz[i][j];
    }
    else if(j==0){
        return sumarmatriz(matriz,i-1,matriz.length-1)+matriz[i][j];
    }
    else{
        return sumarmatriz(matriz,i,j-1)+matriz[i][j];
    }
}

答案 6 :(得分:0)

如果您想一次访问所有内容,我认为您需要这种方法:

public class Array {
  public static void main(String[] args){
    int[][] A = {{1,2,3,4},{1,2,3,4},{1,2,3,4},{1,2,3,4}};
    System.out.print(TwoDSum(A,4,4));
  }
  public static int TwoDSum(int A[][], int n,int m) {
    if(n==1 && m==1) return A[0][0];
    if(m==0){
      n--;
      m=A[n].length;
    }
    return TwoDSum(A,n,m-1)+A[n-1][m-1];
  }
}