使用递归方法将两个2D数组相乘?

时间:2018-02-06 07:14:14

标签: java arrays algorithm recursion

我试图使用递归方法将两个2D数组相乘。我写了这段代码

   public static int mul(int i, int j, int[][]A, int[][] B){
    if(i>(A.length-1) && j>(A[i].length-1)) return 0;
    int x = A[i][j]*B[i][j];
    System.out.println(x);
    return mul(++i, ++j, A, B);

}

  public static void main(String[] args){
    Scanner k= new Scanner(System.in);
    int[][] A = new int[2][2];
    int[][] B = new int[2][2];


    for(int i=0;i<A.length;i++){
        for (int j=0;j<(A[0].length); j++){
            A[i][j]=k.nextInt();

        }

    }
    for(int i=0;i<B.length;i++){
        for (int j=0;j<(B[0].length); j++){
            B[i][j]=k.nextInt();

        }

    }

    mul(0, 0, A, B);
    }

但我收到此错误消息:

java.lang.ArrayIndexOutOfBoundsException:2

在recursive.mul(recursive.java:5)

at recursive.mul(recursive.java:7)

at recursive.mul(recursive.java:7)

at recursive.main(recursive.java:32)

非常感谢你!

1 个答案:

答案 0 :(得分:3)

  

首先检查矩阵之间是否可以相乘。为此,检查第一矩阵的列数是否等于第二矩阵的行数。如果两者都等于继续进行,否则生成输出“不可能”。

     

在Recursive Matrix Multiplication中,我们通过递归调用实现了三个迭代循环。 multiplyMatrix()的最内部递归调用是迭代k(col1或row2)。 multiplyMatrix()的第二次递归调用是更改列,最外层的递归调用是更改行。

     

下面是递归矩阵乘法代码。

<强> CODE:

// Java recursive code for Matrix Multiplication

class GFG 
{
    public static int MAX = 100;

    // Note that below variables are static
    // i and j are used to know current cell of
    // result matrix C[][]. k is used to know
    // current column number of A[][] and row
    // number of B[][] to be multiplied
    public static int i = 0, j = 0, k = 0;

    static void multiplyMatrixRec(int row1, int col1, int A[][],
                       int row2, int col2, int B[][],
                       int C[][])
    {
        // If all rows traversed
        if (i >= row1)
            return;

        // If i < row1
        if (j < col2)
        {
            if (k < col1)
            {
                C[i][j] += A[i][k] * B[k][j];
                k++;

                multiplyMatrixRec(row1, col1, A, row2, col2, B, C);
            }

            k = 0;
            j++;
            multiplyMatrixRec(row1, col1, A, row2, col2, B, C);
        }

        j = 0;
        i++;
        multiplyMatrixRec(row1, col1, A, row2, col2, B, C);
    }

    // Function to multiply two matrices A[][] and B[][]
    static void multiplyMatrix(int row1, int col1, int A[][],
                    int row2, int col2, int B[][])
    {
        if (row2 != col1)
        {
            System.out.println("Not Possible\n");
            return;
        }

        int[][] C = new int[MAX][MAX];

        multiplyMatrixRec(row1, col1, A, row2, col2, B, C);

        // Print the result
        for (int i = 0; i < row1; i++)
        {
            for (int j = 0; j < col2; j++)
                System.out.print(C[i][j]+" ");

            System.out.println();
        }
    }

    // driver program
    public static void main (String[] args) 
    {
        int row1 = 3, col1 = 3, row2 = 3, col2 = 3;
        int A[][] = { {1, 2, 3},
                      {4, 5, 6},
                      {7, 8, 9}};

        int B[][] = { {1, 2, 3},
                      {4, 5, 6},
                      {7, 8, 9} };

        multiplyMatrix(row1, col1, A, row2, col2, B);
    }
}

<强>来源:

https://www.geeksforgeeks.org/matrix-multiplication-recursive/