Как записать рекурсивный вызов в цепочке Маркова без рутинной ошибки - PullRequest
1 голос
/ 29 февраля 2020

ТАК вот метод, который я вызываю из основного. первая часть просто умножает методы вместе. Это возвращение, которое получает ошибки и строку 121. Я выделил строки, которые получают ошибки. Я хочу умножить матрицу, которая была создана с умножением m и m2 на m, исходная матрица непрерывно. Что должно помешать этому продолжаться вечно, пока l oop остановится на 4. Я знаю, что это, вероятно, не лучший способ. вызов таков:

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)

1 Ответ

0 голосов
/ 29 февраля 2020

В то время как у l oop нет шансов, так как вы выполняете в любом случае (с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...