Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 矩阵和数组索引超出范围时出错_Java_Arrays_Matrix - Fatal编程技术网

Java 矩阵和数组索引超出范围时出错

Java 矩阵和数组索引超出范围时出错,java,arrays,matrix,Java,Arrays,Matrix,因此,我需要实现这段代码,它将返回java中矩阵乘法中括号的最佳解决方案。我制作了一个打印“(“”)的函数,主要是构造矩阵M和S来进行解析(dinamic编程)。 在它打印第一个“(”)后,我一直收到此错误: 代码: 公共类程序{ 私有静态int[][]s; 公共静态void parenterizacao(int[]s,int i,int j){ 如果(i==j){ 系统输出打印项次(“M”+i); }否则{ System.out.println(“”); parenterizacao(s,

因此,我需要实现这段代码,它将返回java中矩阵乘法中括号的最佳解决方案。我制作了一个打印“(“”)的函数,主要是构造矩阵M和S来进行解析(dinamic编程)。 在它打印第一个“(”)后,我一直收到此错误:



代码:

公共类程序{
私有静态int[][]s;
公共静态void parenterizacao(int[]s,int i,int j){
如果(i==j){
系统输出打印项次(“M”+i);
}否则{
System.out.println(“”);
parenterizacao(s,i,s[i][j]);
parenterizacao(s,s[i][j]+1,j);
System.out.println(“)”;
}
}
公共静态void main(字符串[]args){
int[]p={15,5,10,20,25};//VETOR p DO ENUNCIADO(alteracoes aqui!!!)
int n=p.长度-1;
int[]m=新的int[n][n];
int[][]s=新int[n-1][n-1];
对于(int i=0;i对于(int i=1;i来说,简短的回答是您正在创建一个3x3数组,然后尝试访问第二行中的第5个元素,这显然是不存在的

正如代码所示,您正在将伪代码中的
s[1..n-1,2..n]
映射到java中的
s[0..n-1][0..n-2]
,例如,伪代码说
s[1,2]
您的java使用
s[0][0]
但您在调用
parenterizacao(s,1,n)

在某些地方,索引映射到零,而在其他地方,索引映射到零,因此,您应该保持一致-或者直接使用伪代码中的索引,并使用未使用的元素使数组变大(例如,不要使用
s[0..2][0..2]
have
s[0..3][0..4]
),或确保每次访问阵列时都映射索引

下面,我修改了您的代码,并保留了伪代码中
I
j
k
l
n
的原始值,但在每次阵列访问时适当地减去1或2:

public static void parenterizacao(int[][] s, int i, int j) {
    if (i == j) {
        System.out.println("M" + i);
    } else {
        System.out.println("(");
        parenterizacao(s, i, s[i-1][j-2]);
        parenterizacao(s, s[i-1][j-2] + 1, j);
        System.out.println(")");
    }
}


for(inti=1;iproblm是您的嵌套循环

for (int l = 1; l < n; l++)
    for (int i = 1; i < l - n; i++)
for(int l=1;l
在这里,
n=3
l
的边界已经是3。然后分配i=3,并通过递增
i
尝试达到2


还有一件事,你应该把
return;
放在递归函数的某个地方。否则,你会有一个无限循环。

试着调试你的代码。你正在创建一个大小为
n-1
的数组,然后你把这个数组连同
n
参数一起传递给方法。你用它来访问数组的索引,它就不会hr引发异常,抱怨数组太短。递归在i==j时退出。我还没有遍历嵌套循环,但它们肯定不会导致问题所问的异常。它们肯定是导致错误的原因。之所以会出现异常,是因为嵌套循环修改了参数。不,是的esn无法使用该数据。正如问题所述,异常发生在第一个“(”-这是因为
parenterizacao(s,1,n)
传递一个3x3数组(
s
),其中
n=4
,第一个递归调用使用
s[i][j]
因此尝试访问
s[1][4]
和boom。所有这些都与循环产生的值无关。(循环也不正确,这会导致进一步的问题-请参阅我的答案了解更多详细信息,但这不会导致原始异常)。非常感谢!我意识到您得到了M和S矩阵计数器-1,但这里是:int q=M[i-1][k-1]+M[k][j-1]+p[i-2]*p[k-1]*p[j-1];数组p应该保持i-1、k和j。我让它非常有效!
public static void parenterizacao(int[][] s, int i, int j) {
    if (i == j) {
        System.out.println("M" + i);
    } else {
        System.out.println("(");
        parenterizacao(s, i, s[i-1][j-2]);
        parenterizacao(s, s[i-1][j-2] + 1, j);
        System.out.println(")");
    }
}
    for (int i = 1; i <= n; i++) {
        m[i-1][i-1] = 0;
    }

    for (int l = 2; l <= n; l++) {
        for (int i = 1; i <= n - l + 1; i++) {
            int j = i + l - 1;
            m[i-1][j-1] = 9999;
            for (int k = i; k <= j - 1; k++) {
                int q = m[i-1][k-1] + m[k][j-1] + p[i - 1] * p[k] * p[j];
                if (q < m[i-1][j-1]) {
                    m[i-1][j-1] = q;
                    s[i-1][j-2] = k;
                }
            }
        }
    }
    parenterizacao(s, 1, n);
for (int l = 1; l < n; l++)
    for (int i = 1; i < l - n; i++)