【发布时间】:2018-02-14 03:55:31
【问题描述】:
这是一个奇怪的项目,所以只用了非常奇怪的代码。我遇到的真正问题是为什么这种递归方法永远不会达到基本情况。
public int determinant() {
int determinant = 0;
if(getSize() == 2)
{
return (getElement(1, 1) * getElement (2, 2)) - (getElement(1,2) * getElement(2,1));
}
determinant += Math.pow(-1, getSize()+1) * getElement(getSize(), 1) * minor(getSize(),1).determinant();
return determinant;
}
public SparseInterface minor(int row, int col) {
SparseMatrix minor = new SparseMatrix();
minor.matrix = matrix;
for(int i = 0; i < matrix.size(); i++)
{
if(row == minor.matrix.get(i).getRow() || col == minor.matrix.get(i).getCol())
{
minor.matrix.remove(i);
}
}
minor.size--;
return minor;
}
因此,行列式调用minor,它返回一个新的方阵,其大小小1。我从一个 5x5 矩阵开始,并在其上调用行列式方法。然后,该方法采用 5x5 矩阵(4x4 矩阵)的次要行列式。这一直持续到我们到达基本情况,它是一个 2x2 矩阵并且计算行列式是微不足道的。
但是,问题在于代码永远不会超过它是 4x4 矩阵的点。每次调用minor时(它应该在每次递归调用中)它都应该输出更小的矩阵,因为minor中的最后一行代码minor.size--;。
通过一些错误测试,矩阵的大小似乎第一次减小了,但在随后的递归调用中没有。我对Java有点陌生,Java是否有一些关于方法调用中的方法调用的奇怪规则,导致它没有按应有的方式递减?除此之外,我不知所措。
提前致谢。
对于那些询问的人:
public int getElement(int row, int col) {
int element = 0;
if(row > getSize() || col > getSize())
{
System.out.println("Column/row combination is out of bounds.");
return element;
}
for(int i = 0; i < matrix.size(); i++)
{
if(matrix.get(i).getRow() == row && matrix.get(i).getCol() == col)
{
element = matrix.get(i).getData();
}
}
return element;
}
public int getSize() {
return size;
}
Size 只是 SparseMatrix 类的一个数据成员,它表示我正在建模的奇怪的不存在矩阵是 SizexSize。有关更多详细信息,我在下面的 cmets 中对此进行了介绍。
public class SparseMatrix implements SparseInterface {
public LinkedList<Index> matrix;
public int size;
public SparseMatrix() {
matrix = new LinkedList<Index>();
size = 5;
}
【问题讨论】:
-
请告诉我们
getElement()和getSize()的代码。 -
@RobbyCornelissen 次要不调用次要,但行列式调用行列式。
-
@AidanO'Connell 是的,你是对的。错过了。
-
是的,据我所知,没有递归的事情发生。您还在每次递减之前在方法的开头更新 SparseMatrix。因此,您的 minor.size-- 每次都会做同样的事情,除非您以一种奇怪的构造函数方式将 SparseMatrix 创建为单例,我认为这是不可能的,或者 size 是 static final 之类的。我认为我们需要查看更多代码才能确切知道发生了什么,但此代码中没有发生递归。
-
您的问题是您正在更新它,并且大小始终从 5 开始。它递减一次,然后调用您的方法,再次更新 SparseMatrix,再次将大小设置为 5,因为您刚刚更新了它,然后再次递减到 4。