2 つの行列 A と B が与えられます。タスクは行列 A と行列 B を再帰的に乗算することです。行列 A と行列 B に乗算互換性がない場合は、出力「不可能」を生成します。
例:
Input: A = 12 56
45 78
B = 2 6
5 8
Output: 304 520
480 894
Input: A = 1 2 3
4 5 6
7 8 9
B = 1 2 3
4 5 6
7 8 9
Output: 30 36 42
66 81 96
102 126 150
まずは参照することをお勧めします 行列の反復乗算 。
まず行列間の乗算が可能かどうかを確認します。このために、最初の行列の列数が 2 番目の行列の行数と等しいかどうかを確認します。両方が等しい場合はさらに続行し、そうでない場合は出力「不可能」を生成します。
再帰行列乗算では、再帰呼び出しを通じて反復の 3 つのループを実装します。最も内側の再帰呼び出し multiplyMatrix() k (col1 または row2) を反復することです。の 2 番目の再帰呼び出し multiplyMatrix() は列を変更するもので、最も外側の再帰呼び出しは行を変更するものです。
HTMLからjs関数を呼び出す
以下は再帰行列乗算のコードです。
C++// Recursive code for Matrix Multiplication #include const int MAX = 100; void multiplyMatrixRec(int row1 int col1 int A[][MAX] int row2 int col2 int B[][MAX] int C[][MAX]) { // 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 static int i = 0 j = 0 k = 0; // 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[][] void multiplyMatrix(int row1 int col1 int A[][MAX] int row2 int col2 int B[][MAX]) { if (row2 != col1) { printf('Not Possiblen'); return; } int C[MAX][MAX] = { 0 }; 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++) printf('%d ' C[i][j]); printf('n'); } } // Driven Program int main() { int A[][MAX] = { { 1 2 3 } { 4 5 6 } { 7 8 9 } }; int B[][MAX] = { { 1 2 3 } { 4 5 6 } { 7 8 9 } }; int row1 = 3 col1 = 3 row2 = 3 col2 = 3; multiplyMatrix(row1 col1 A row2 col2 B); return 0; } // This code is contributed by Aarti_Rathi
Java // 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 Possiblen'); 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); } } // Contributed by Pramod Kumar
Python3 # Recursive code for Matrix Multiplication MAX = 100 i = 0 j = 0 k = 0 def multiplyMatrixRec(row1 col1 A row2 col2 B C): # 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 global i global j global k # 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 += 1 multiplyMatrixRec(row1 col1 A row2 col2B C) k = 0 j += 1 multiplyMatrixRec(row1 col1 A row2 col2 B C) j = 0 i += 1 multiplyMatrixRec(row1 col1 A row2 col2 B C) # Function to multiply two matrices # A[][] and B[][] def multiplyMatrix(row1 col1 A row2 col2 B): if (row2 != col1): print('Not Possible') return C = [[0 for i in range(MAX)] for i in range(MAX)] multiplyMatrixRec(row1 col1 A row2 col2 B C) # Print the result for i in range(row1): for j in range(col2): print( C[i][j] end = ' ') print() # Driver Code A = [[1 2 3] [4 5 6] [7 8 9]] B = [[1 2 3] [4 5 6] [7 8 9]] row1 = 3 col1 = 3 row2 = 3 col2 = 3 multiplyMatrix(row1 col1 A row2 col2 B) # This code is contributed by sahilshelangia
C# // C# recursive code for // Matrix Multiplication using System; 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) { Console.WriteLine('Not Possiblen'); 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++) Console.Write(C[i j] + ' '); Console.WriteLine(); } } // Driver Code static public void Main () { 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); } } // This code is contributed by m_kit
JavaScript <script> // Javascript recursive code for Matrix Multiplication let 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 let i = 0 j = 0 k = 0; function multiplyMatrixRec(row1 col1 A row2 col2 B 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[][] function multiplyMatrix(row1 col1 A row2 col2 B) { if (row2 != col1) { document.write('Not Possible' + ''); return; } let C = new Array(MAX); for(let i = 0; i < MAX; i++) { C[i] = new Array(MAX); for(let j = 0; j < MAX; j++) { C[i][j] = 0; } } multiplyMatrixRec(row1 col1 A row2 col2 B C); // Print the result for (let i = 0; i < row1; i++) { for (let j = 0; j < col2; j++) document.write(C[i][j]+' '); document.write(''); } } let row1 = 3 col1 = 3 row2 = 3 col2 = 3; let A = [ [1 2 3] [4 5 6] [7 8 9] ]; let B = [ [1 2 3] [4 5 6] [7 8 9] ]; multiplyMatrix(row1 col1 A row2 col2 B); </script>
出力
30 36 42 66 81 96 102 126 150
時間計算量: O(row1 *col2*col1)
補助スペース: O(log (max(row1col2)) 再帰により暗黙的なスタックが使用されるため
クイズの作成