这是一个奇怪的项目,因此非常奇怪的代码。我遇到的真正问题是为什么这个递归方法永远不会达到基本情况。
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;
}
因此,determinant调用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 is只是SparseMatrix类的一个数据成员,它说我正在建模的奇怪的不存在矩阵是SizexSize。有关详细信息,我在下面的评论中写到了这一点。
public class SparseMatrix implements SparseInterface {
public LinkedList<Index> matrix;
public int size;
public SparseMatrix() {
matrix = new LinkedList<Index>();
size = 5;
}
答案 0 :(得分:1)
代码对我来说有点混乱。我认为您正试图在minor()
方法中保持 SparseMatrix 对象的状态。
我觉得这样的事情可能是你想要的吗?
minor.determinant()
有点让人困惑。 SparseMatrix 中有不同的determinant()
方法吗?您之前返回了在minor方法中创建的 SparseMatrix 对象,之前有minor(getSize(),1).determinant()
。看起来您在 SparseMatrix 类中调用了determinant()
方法,但我在代码中看不到该类中的方法。这些方法都在 SparseMatrix 类中吗?
我还建议将对象的变量名更改为与您使用的方法名不同的名称。它降低了代码的可读性。
无论哪种方式,我认为这可以帮助你。private SparseMatrix minor = new SparseMatrix();
public int determinant() {
int determinant = 0;
if(getSize() == 2)
{
return (getElement(1, 1) * getElement (2, 2)) - (getElement(1,2) * getElement(2,1));
}
minor(getSize(),1);
determinant += Math.pow(-1, getSize()+1) * getElement(getSize(), 1) * this.minor.determinant();
return determinant;
}
public void minor(int row, int col) {
//in your previous code, I'm not sure where you're getting Matrix from,
//so I'll leave this in here - I think you're also wanting to use the
//matrix that is now stored in your minor object, so I changed that in
//the for loop, but there are likely more elegant solutions for this if
//I saw all the code
minor.matrix = matrix;
for(int i = 0; i < this.minor.matrix.size(); i++)
{
if(row == this.minor.matrix.get(i).getRow() || col == this.minor.matrix.get(i).getCol())
{
this.minor.matrix.remove(i);
}
}
this.minor.size--;
}