首页 > 解决方案 > 如何在 Markov Chain W/O runtine 错误中编写递归调用

问题描述

所以这是我从主调用的方法。第一部分只是将方法相乘。得到错误的是返回和第 121 行。我强调了得到错误的行。我想将通过 m 和 m2 与 m(原始矩阵)相乘创建的矩阵不断地相乘。应该阻止它永远运行的是将在 4 处停止的 while 循环。我知道这可能不是最好的方法。电话是这样的:

System.out.println(m.rec(m2));

m 和 m2 是克隆。

public Matrix rec(Matrix m2) throws Exception{
    try{
        int v = 0;
        while(v < 4){
        if(c!=m2.r){
            System.out.println("Argh");
            throw new RuntimeException();
        }//if
        **m3=new Matrix(r, m2.c); LINE 121!!! <------ **
        for(int i=0; i<r; i++){
            for(int j=0; j<m2.c; j++){
                m3.data[i][j]=0;
                for(int k=0; k<c; k++){
                    m3.data[i][j]+= ( ( data[i][k]) )  *  (m2.data[k][j]);
                }//k
            }//j
        }//i
        v++;
        ** return m2.rec(m3); //LINE 131 <-------------**
        }//while
    }//try
    catch(Exception ex){
        System.out.println("Argh");
    }//catch
    return m2;
}//multiply

这是错误,它会数千次打印第 131 行错误。

Exception in thread "main" java.lang.StackOverflowError
    at markovchain.Matrix.rec(Matrix.java:121)
    at markovchain.Matrix.rec(Matrix.java:131)
    at markovchain.Matrix.rec(Matrix.java:131)

标签: javarecursionmarkov-chainsmarkov

解决方案


while 循环没有机会,因为您在任何情况下都执行(v = 0)

return m2.rec(m3); //LINE 131 <-------------**

它直接进入递归地狱。

您可以通过添加参数级别来限制递归深度。在不完全理解您的算法的情况下,这只是一个提示......

public Matrix rec(Matrix m2, int level) throws Exception{
    try{
        if (level > 4) {
            return m2;
        }
        int v = 0;
        while(v < 4){
        if(c!=m2.r){
            System.out.println("Argh");
            throw new RuntimeException();
        }//if
        **m3=new Matrix(r, m2.c); LINE 121!!! <------ **
        for(int i=0; i<r; i++){
            for(int j=0; j<m2.c; j++){
                m3.data[i][j]=0;
                for(int k=0; k<c; k++){
                    m3.data[i][j]+= ( ( data[i][k]) )  *  (m2.data[k][j]);
                }//k
            }//j
        }//i
        v++;
        ** return m2.rec(m3, level +1); //LINE 131 <-------------**
        }//while
    }//try
    catch(Exception ex){
        System.out.println("Argh");
    }//catch
    return m2;
}//multiply

推荐阅读